uCOS 就续表详解

来源:互联网 发布:淘宝子账号哪里登陆 编辑:程序博客网 时间:2024/05/01 14:51

//发的博客,主要是自己的一些初短简介,如果有错误,希望能提高大侠的指点。  同时也是为了给正在学习者一点参考

1.预备知识

要想对 任务就绪表有详解,就要先知道这几个表:OSRdyGrpOSRdyTbl,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的值为01101000bit),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;

 

0 0
原创粉丝点击