请选择 进入手机版 | 继续访问电脑版
快捷导航
0 70

μC/OS-Ⅱ内核结构_2_就绪表

袁绪蝶 于 2017-12-18 10:52 发表在 [技术分享] [复制链接]
本帖最后由 袁绪蝶 于 2017-12-19 16:24 编辑

就绪表(Ready List)
就绪态:意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,暂时不能运行。

就绪表使用过程:
优先级分解->创建就绪表->任务调度,得到最高优先级

就绪表
针对就绪表的操作:
-入口
*使任务进入就绪态
*使任务脱离就绪态
-出口
*根据就绪表确定最高优先级

每个就绪的任务都放入就绪表中(ready list)中,就绪表有两个变量:OSRdyGrp、OSRdyTbl[]。
(一)根据优先级确定就绪表

优先级为12的任务进入就绪状态,12=0000 1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,
(如上图右,因为0000 0111b【7】<0000 1100b【12】<0000 1111b【15】,所以12在OSRdyGrp的第1位置,在OSRdyTbl[1]的第4位置)
相应的数学表达式为:
OSRdyGrp    |=0x02【0000 0010b】<= OSMapTbl[1]【0000 0010b】
OSRdyTbl[1] |=0x10【0001 0000b】<= OSMapTbl[4]【0001 0000b】


(二)使任务进入就绪态
如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是:
OSRdyGrp                 |=OSMapTbl[prio >> 3];
OSRdyTbl[prio>>3]  |=OSMapTbl[prio & 0x07];
即:OSRdyGrp              |= OSTCBBitY
    OSRdyTbl[prio>>3]  |= OSTCBBitX
假设优先级为12——0000 1100b
OSMapTbl[1]=0000 0010b
OSMapTbl[4]=0001 0000b
OSRdyGrp      |=0x02【0001 0000b】
OSRdyTbl[1]   |=0x10【0000 0010b】
(三)使任务脱离就绪态
将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。
If((OSRdyTbl[prio>>3]&=OSMapTbl[prio & 0x07])==0);
OSRdyGrp&=OSMapTbl[prio>>3];
(四)根据就绪表确定最高优先级
通过OSRdyGrp值确定高3位,假设值为0x24=0010 0100b, => 对应OSRdyTbl[2] 和OSRdyTbl[5],高优先级为2
通过OSRdyTbl[2]的值来确定低3位,
假设值为0x12=0001 0010b ,=>第2个和第5个任务,取高优先级为2,则最高优先级的任务号为17
(五)源代码中使用查表法确定最高优先级
查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的
High3 =OSUnMapTbl[OSRdyGrp];
Low3  =OSUnMapTbl[OSRdyTbl[High3]];
Prio  =(High3<<3)+Low3;


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 0 个关于本帖的回复 最后回复于 2017-12-18 10:52

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-16 19:24