本帖最后由 袁绪蝶 于 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;
|
共 0 个关于本帖的回复 最后回复于 2017-12-18 10:52