欢迎来到天天文库
浏览记录
ID:48776221
大小:118.50 KB
页数:13页
时间:2020-01-23
《任务就绪表的实现.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](0i7),若它的某一位为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();}检查是否中断调用和允许任务调用找到优先级最高的任务该任务是否正在运行源代码中使用了查表法查表法具有
此文档下载收益归作者所有