任务就绪表的实现.ppt

任务就绪表的实现.ppt

ID:48776221

大小:118.50 KB

页数:13页

时间:2020-01-23

任务就绪表的实现.ppt_第1页
任务就绪表的实现.ppt_第2页
任务就绪表的实现.ppt_第3页
任务就绪表的实现.ppt_第4页
任务就绪表的实现.ppt_第5页
资源描述:

《任务就绪表的实现.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、任务就绪表每个任务的就绪态标志放入在就绪表中,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。任务就绪表OSRdyGrp1207654300X0X1X2Y0Y2Y1任务优先级20176543108915141312111816172322212019262425313029282734323339383736

2、35424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[8]XY优先级最低任务(空闲任务)优先级最高任务任务优先级号对于整数OSRdyTbl[i](0i7),若它的某一位 为1,则OSRdyGrp的第i位为1。根据优先级确定就绪表(1)假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:OSRdyGrp

3、=0x0

4、2;OSRdyTbl[1]

5、=0x10;而优先级为21的任务就绪21=10101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:OSRdyGrp

6、=0x04;OSRdyTbl[2]

7、=0x20;根据优先级确定就绪表(2)从上面的计算可知:若OSRdyGrp及OSRdyBbl[]的第n位置1,则应该把OSRdyGrp及OSRdyBbl[]的值与2n相或。uC/OS中,把2n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是:OSMapTbl[0]=20=

8、0x01(00000001)OSMapTbl[1]=21=0x02(00000010)……OSMapTbl[7]=27=0x80(10000000)使任务进入就绪态如果prio是任务的优先级,即任务的标识号,则将任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrp

9、=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]

10、=OSMapTbl[prio&0x07];假设优先级为12——1100bOSRdyGrp

11、=0x02;OSRdyTbl[1]

12、=0x10;使任务脱离就绪态将任务就绪表OSR

13、dyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即该任务所在组的所有任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。if((OSRdyTbl[prio>>3]&=OSMapTbl[prio&0x07])==0)OSRdyGrp&=OSMapTbl[prio>>3];3.2.2任务的调度C/OS是可抢占实时多任务内核,它总是运行就绪任务中优先级最高的那一个。C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度

14、的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。确定哪个任务的优先级最高,应该选择哪个任务去运行,这部分的工作是由调度器(Scheduler)来完成的。任务级的调度是由函数OSSched()完成的;中断级的调度是由另一个函数OSIntExt()完成的。根据就绪表确定最高优先级两个关键:将优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号;根据就绪表确定最高优先级通过OSRdyGrp值确定高3位,假设OSRdyGrp=0x08=

15、 0x00001000,第3位为1,优先级的高3位为011;通过OSRdyTbl[3]的值来确定低3位,假设OSRdyTbl[3]=0x3a,第1位为1,优先级的低3位为001,3*8+1=2500011001任务优先级任务调度器voidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();if((OSLockNesting

16、OSIntNesting)==0){y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[O

17、SRdyTbl[y]]);if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OS_TASK_SW();}}OS_EXIT_CRITICAL();}检查是否中断调用和允许任务调用找到优先级最高的任务该任务是否正在运行源代码中使用了查表法查表法具有

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。