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
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Cline

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值