uCOS优先级与任务编号计算之解析

 

 初开两三遍uCOS优先级与任务编号计算,没看懂。可能是自己的理解能力太差吧。但如果能举例说明,我相信会更好理解。本文以例子的方式,把优先级与任务编号计算之间的关系大白于天下,希望你看一遍就能理解其中的逻辑。(提示:为了简化,假设最多64个任务, 编号从0-63,优先级与编号相同。)

 

先看相关的几个变量或数组:

OS_EXT  INT8U             OSRdyGrp;           /* Ready list group                         */
OS_EXT  INT8U             OSRdyTbl[8];       /* Table of tasks which are ready to run    */

INT8U  const  OSUnMapTbl[256] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
};

 

解释-1

如果0~7之间任何一个任务就绪,OSRdyGrp的第0位置1。

如果8~15之间任何一个任务就绪,OSRdyGrp的第1位置1。

......(依次类推)

 

解释-2

OSRdyTbl[0] 的8位对应于任务#0~7, 如果第0位是1表明任务#0就绪;第1位是1表明任务#1就绪......

OSRdyTbl[1] 的8位对应于任务#8~15, 如果第0位是1表明任务#8就绪;第1位是1表明任务#9就绪.....

 

举例:

假设任务#25号就绪,那将它加入就绪表的代码是(b表示二进制):

y = (25>>3);     // 0x3

OSRdyGrp |= 1 <<y;     //OSRdyGrp  |= 00001000b;

x = (25 & 0x7);  //0x1

OSRdyTbl[(25>>3)]  |= 1 <<x;  //OSRdxyTbl[3] |= 00000010b;

把任务移出就绪队立做相应的反操作,只是当OSRdyTbl[n]为0时,要把OSRdyGrp 第n位置0。

 

如何找最高优先级任务:

 

假设现在25,27,32号任务就绪,那

OSRdyGrp    == 00011000b. 

OSRdyTbl[3] == 00001010b;

OSRdyTbl[4] == 00000001b;

显然我们要求出OSRdyGrp 从右向左第一个1的位置, 应当是3。你可以通过移位实现,但如果有一张表,一查便知就快多了。于是有

 

y = OSUnMapTbl[OSRdyGrp] ; // OSUnMapTbl[00011000b] == OSUnMapTbl[24] == 3

同理,求出OSRdyTbl[3]  从右向左第一个1的位置, 应当是1。

x=OSUnMapTbl[ OSRdyTbl [y] ]; //OSUnMapTbl[00001010b] == OSUnMapTbl[10] ==1

 

有了x,y再求优先级用很容易了。

Priority = y * 8 + x;

再从优先级即可找到TCB!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值