//发的博客,主要是自己的一些初短简介,如果有错误,希望能提高大侠的指点。 同时也是为了给正在学习者一点参考
1.预备知识
要想对 任务就绪表有详解,就要先知道这几个表:OSRdyGrp,OSRdyTbl,OSMapTbl,OSUnMapTbl(网上有多介绍这几张表,自己查)
2.任务进入就绪态
每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。//OSRdyGrp和OSRdyTbl 都是bit来标志,例如当新增任务时,任务级别:23.则OSRdyTbl表中,这一位为1.(其他任务未就绪)OSRdyGrp值:00000100;OSRdyTbl[2] = 1000000(bit)
OSRdyGrp和OSRdyTbl[]的关系见图3.3,是按以下规则给出的:
任务进入就绪态:
OSRdyGrp |= OSMapTbl[prio >> 3]; |
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07]; |
//由上面的说明,就可以明白 一个任务的优先级在怎么放在 就续表中的。
3.查找最高优先级任务
算法:
y = OSUnMapTbl[OSRdyGrp]; |
x = OSUnMapTbl[OSRdyTbl[y]]; |
prio = (y << 3) + x; |
举例:若OSRdyGrp的值为01101000(bit),OSRdyTbl[3]=11100100(bit),查表 3=OSUnMapTbl[0x68],
2=OSUnMapTbl[0xE4],
26 = (3 << 3 ) + 2
4.任务脱离就绪态:(其实就是 求反的处理 针对 任务就绪态而言)
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0) |
OSRdyGrp &= ~OSMapTbl[prio >> 3]; |
//为什么不用 任务进入就绪态的算法呢? 因为这里只是让一个 任务脱离就绪态,若同一组中任 仍有任务,OSRdyGrp 对应位仍然为1。 即如果对进入就绪态的算法求反,OSRdyGrp对应为就会为消失1,不管这一组其他任务。
如果第0组任何一个任务进入就绪态 -------->OSRdyGrp |= 00000001;
如果第1组任何一个任务进入就绪态 -------->OSRdyGrp |= 00000010;
如果第2组任何一个任务进入就绪态 -------->OSRdyGrp |= 00000100;
如果第3组任何一个任务进入就绪态 -------->OSRdyGrp |= 00001000;
如果第4组任何一个任务进入就绪态 -------->OSRdyGrp |= 00010000;
如果第5组任何一个任务进入就绪态 -------->OSRdyGrp |= 00100000;
如果第6组任何一个任务进入就绪态 -------->OSRdyGrp |= 01000000;
如果第7组任何一个任务进入就绪态 -------->OSRdyGrp |= 10000000;