初开两三遍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!!!