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                             */
};

......（依次类推）

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

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

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

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

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

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

OSRdyGrp    == 00011000b.

OSRdyTbl[3] == 00001010b;

OSRdyTbl[4] == 00000001b;

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

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

Priority = y * 8 + x;

• 0
点赞
• 3
收藏
• 打赏
• 0
评论
04-02 1366
11-11 1028
08-18 2万+
02-20 2938
10-18 2466
06-08 2719
08-20 1302
08-05 519
03-14 1万+
01-02 23
10-18 1万+

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

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

Cline

¥2 ¥4 ¥6 ¥10 ¥20

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