uCOS 就续表详解

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值