《μCOSⅡ中的任务调度.ppt》由会员分享,可在线阅读,更多相关《μCOSⅡ中的任务调度.ppt(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、C/OS中的任务调度,Group01小组柴永锋李逢春苗 冬,相关介绍,C/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。 C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的 C/OS II 2.51版本支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。 C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关,任务状态,任务控制块(TCB),任务控制块 OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。 所有的任务控制块分为两条链表,空闲链表和使用链表。
2、,C/OS-II任务控制块.ucos-ii.h,typedef struct os_tcb OS_STK *OSTCBStkPtr; 指向当前任务栈顶的指针 #if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; 指向用户定义的任务控制块扩展 OS_STK *OSTCBStkBottom; 指向任务栈底的指针 INT32U OSTCBStkSize; 栈中可容纳的指针元数 INT16U OSTCBOpt; 把“选择项”传给OSTaskCreateExt() INT16U OSTCBId; 任务的识别码 #endif struct os_tcb *OSTCBN
3、ext; 任务控制块OS_TCBs的双重链接 struct os_tcb *OSTCBPrev; #if OS_EVENT_EN OS_EVENT *OSTCBEventPtr; /* 指向事件控制块*/ #endif,C/OS-II任务控制块.ucos-ii.h,#if (OS_Q_EN0) ,与TCB相关的结构,两个关键: 优先级数分解为高三位和低三位分别确定; 高优先级有着小的优先级号 ;,优先级和就绪任务表的位置关系,每个就绪的任务都放入就绪表中(ready list)中,就绪表有两个变量:OSRdyGrp、OSRdyTbl,优先根据优先级确定就绪表(1),假设优先级为12的任务进入就
4、绪状态,12=1100b,则OSRdyTbl1的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为: OSRdyGrp |=0 x02; OSMapTbl1=(0000 0010) OSRdyTbl1 |=0 x10; OSMapTbl4=(0001 0000) 而优先级为21的任务就绪21=10 101b,则OSRdyTbl2的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为: OSRdyGrp |=0 x04; OSMapTbl2=(0000 0100) OSRdyTbl2 |=0 x20; OSMapTbl5=(0010 0000),根据优先级确定就绪表(2),
5、从上面的计算我们可以得到:若OSRdyGrp及OSRdyTbl的第n位置1,则应该把OSRdyGrp及OSRdyTbl的值与2n 相或。uC/OS中,把2n的n=0-7的8个值先计算好存在数组OSMapTbl7中,也就是: OSMapTbl0 =20=0 x01(0000 0001) OSMapTbl1 =21=0 x02(0000 0010) ,1,00000010,3,00001000,5,00100000,Index,Bit Mask (Binary),使任务进入就绪态,如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是: OSRdyGrp |=
6、OSMapTblprio3; OSRdyTblprio3 |=OSMapTblprio ,根据就绪表确定最高优先级,通过OSRdyGrp值确定高3位,假设为0 x24=100 100b, - 对应OSRdyTbl2 和OSRdyTbl5,高优先级为2 通过OSRdyTbl2的值来确定低3位, 假设为0 x12=010 010b ,-第2个和第5个任务,取高优先级为2,则最高优先级的任务号为17,源代码中使用了查表法,查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的 High3 =OSUnMapTblOSRdyGrp; Low3 =OSUnMapTblOSRd
7、yTblHigh3; Prio =(High33)+Low3;,优先级判定表OSUnMapTbl256(os_core.c),INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1,
8、 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1,
9、 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 ;,举例: 如OSRdyGrp的值为00101000B,即0X28,则查得OSUnMapTblOSRdyGrp的值是3,它相应于OSRdyGrp中的第3位置1; 如OSRdyTbl3的值是11100100B,即0XE4,则查OSUnMapTblOSRdyTbl3的值是2,则进入就绪态的最高任务优先级 Prio=3*8+2=26,Task scheduler,void OS_Sched (void) /*os_core.c中*/ INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting =0) ,谢谢!,
限制150内