编辑: bingyan8 2019-07-17
μC/OSⅡ中的任务调度 Group01小组柴永锋李逢春苗 冬 相关介绍 ?C/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行.

?C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的?C/OS CII 2.51版本支持64个任务,每个任务一个特定的优先级.优先级越高,数字越小.?C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关 任务状态 任务控制块(TCB) 任务控制块 OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等.所有的任务控制块分为两条链表,空闲链表和使用链表. ?C/OS-II任务控制块.ucos-ii.h typedef struct os_tcb { OS_STK *OSTCBStkPtr;

指向当前任务栈顶的指针 #if OS_TASK_CREATE_EXT_EN>0 void *OSTCBExtPtr;

指向用户定义的任务控制块扩展 OS_STK *OSTCBStkBottom;

指向任务栈底的指针 INT32U OSTCBStkSize;

栈中可容纳的指针元数 INT16U OSTCBOpt;

把"选择项"传给OSTaskCreateExt() INT16U OSTCBId;

任务的识别码 #endif struct os_tcb *OSTCBNext;

任务控制块OS_TCBs的双重链接 struct os_tcb *OSTCBPrev;

#if OS_EVENT_EN OS_EVENT *OSTCBEventPtr;

/* 指向事件控制块*/#endif ?C/OS-II任务控制块.ucos-ii.h #if ((OS_Q_EN>0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN >0) void *OSTCBMsg;

指向传给任务的消息的指针#endif INT16U OSTCBDly;

任务延时若干时钟节拍 INT8U OSTCBStat;

任务的状态字 0,就绪 INT8U OSTCBPrio;

任务优先级 INT8U OSTCBX;

INT8U OSTCBY;

用于加速任务进入就绪态的过程 INT8U OSTCBBitX;

或进入等待事件发生状态的过程 INT8U OSTCBBitY;

#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;

表示该任务是否需要删除自身 #endif} OS_TCB;

与TCB相关的结构 两个关键:优先级数分解为高三位和低三位分别确定;

高优先级有着小的优先级号 ;

优先级和就绪任务表的位置关系 每个就绪的任务都放入就绪表中(ready list)中,就绪表有两个变量:OSRdyGrp、OSRdyTbl[] 优先根据优先级确定就绪表(1) 假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为: OSRdyGrp |=0x02;

OSMapTbl[1]=(0000 0010) OSRdyTbl[1] |=0x10;

OSMapTbl[4]=(0001 0000)而优先级为21的任务就绪21=10 101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为: OSRdyGrp |=0x04;

OSMapTbl[2]=(0000 0100) OSRdyTbl[2] |=0x20;

OSMapTbl[5]=(0010 0000) 根据优先级确定就绪表(2) 从上面的计算我们可以得到:若OSRdyGrp及OSRdyTbl[]的第n位置1,则应该把OSRdyGrp及OSRdyTbl[]的值与2n 相或.uC/OS中,把2n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是: OSMapTbl[0] =20=0x01(0000 0001) OSMapTbl[1] =21=0x02(0000 0010)? ……

0 00000001

1 00000010

2 00000100

3 00001000

4 00010000

5 00100000

6 01000000

7 10000000 Index Bit Mask (Binary) 使任务进入就绪态 如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrp |=OSMapTbl[prio>>3];

OSRdyTbl[prio>>3] |=OSMapTbl[prio & 0x07];

假设优先级为12――1100bOSMapTbl[1]=00000010OSMapTbl[4]=00010000OSRdyGrp |=0x02;

OSRdyTbl[1] |=0x10;

根据就绪表确定最高优先级 通过OSRdyGrp值确定高3位,假设为0x24=100 100b, ---〉 对应OSRdyTbl[2] 和OSRdyTbl[5],高优先级为2通过OSRdyTbl[2]的值来确定低3位, 假设为0x12=010 010b ,---〉第2个和第5个任务,取高优先级为2,则最高优先级的任务号为17 源代码中使用了查表法 查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的High3 =OSUnMapTbl[OSRdyGrp];

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题