1.当前面临什么问题

(1)什么是就绪表
(2)就绪表的难点和关键点:快捷,方便

2.就绪表可以怎样设计

(1)最简单:一个数组元素表示一个任务状态
(2)省内存稍复杂低效率:一个bit表示一个任务状态

3.uCOS2的就绪表设计

(1)一个bit表示一个任务状态,构成8*8的矩阵
(2)纵向OSRdyGrp一个bit囊括一个组中8个任务
(3)横向OSRdyTbl[8]中每一个元素的8个bit分别对应组中8个任务
(4)0表示非就绪态、1表示就绪态
(5)查表时先查OSRdyGrp,再根据结果查有就绪态任务的组。实际上性能提升点在于省去了对没有就绪态的组中8个任务的遍历过程。
(6)这就是所谓算法,这就是所谓数据结构

备注:uCOS2使用的是抢占式的实时调度算法,调度原则是:在每一个systick的hanlder中,都要去判断下64个任务中所有处于就绪态的任务里,谁的优先级最高,就执行谁就行了。

自己设计的就绪表1:
u8 rdyTbl[64]; // 最简单的数组类型的就绪表,每一个元素表示一个任务的状态,0表示非就绪,1表示就绪态。因为优先级和任务是一一对应的,所以数组下标可以和优先级直接对应。
操作举例:
if (rdyTbl[15] == 1) // 判断优先级为15的任务是否处于就绪态
rdyTbl[3] = 1;

0
1
2
3
4

自己设计的就绪表2:
u8 rdyTbl[8]; // 数组总共是64个位,分成8个字节。每一个位表示一个任务的状态,0表示非就绪,1表示就绪态。这样是可以省内存,但是优先级不能直接作为数组下标来使用了,所以变得复杂了。

7 6 5 4 3 2 1 0
15 14 13 12 11 10 9 8

操作举例:
if ((rdyTbl[1] & 0x80) == 0x80) // 判断优先级为15的任务是否处于就绪态
rdyTbl[0] |= (1<<3); // 将优先级为3的任务置于就绪态
rdyTbl[1] &= ~(1<<(13%8)); // 将优先级为13的任务置于非就绪态
rdyTbl[n/8] |= (1<<(n%8)); // 将优先级为n的任务置于就绪态
rdyTbl[n/8] &= ~(1<<(n%8)); // 将优先级为13的任务置于非就绪态

uCOS2的就绪表设计:
(1)rdyTbl中一个组中8个任务的就绪态全部是0时,这个组的rdyGrp对应的位才是0;只要有1个1对应的rdyGrp的位就是1.
(2)rdyGrp这个变量也是拆成8个位来使用的,这个变量的值反映了哪个组中是有就绪态任务的。假设rdyGrp的值为0x00,说明64个任务全部处于非就绪态(注意我们根本不需要去查rdyTab就知道了)。假设rdyGrp值为0x04,说明第2组(0x04是0b00000100,bit2为1,对应第2组)有就绪态的任务,其他组根本没有根本不用去查rdyTbl,只需要查第2组的rdyTbl即可。

https://blog.csdn.net/guozhongwei1/article/details/45678933