很多关于UCOS的内核源码的文章已经很多也都和很好,但是我还是自己写下自己关于任务优先级确定的自己的一些看法。毕竟只有自己理解了才是自己的,才可以完全理解。
关于ucos任务优先级首先要确定一个变量任务优先级变量
1 priority ,这个变量在嵌入式实时操作系统邵贝贝译的书中76页,很清楚的可以看明白,priority 是个六位的变量,低三位组内偏移,高三位是组号
问题:这个组是什么?
ucos总共可以有64个任务,每个任务优先级不同,所以可以有64个优先级,64个优先级可以分为8组,8个任务一组,所以前面priority变量保存的就是任务优先级的组号和组内偏移
2 priority 低三位会保存到一个变量中OSTCBY,高三位保存到OSTCBX,他们的取值范围都是0~7,见下面的代码
ptcb->OSTCBY = (INT8U)(prio >> 3); ptcb->OSTCBX= (INT8U)(prio & 0x07);
3 由OSTCBY和OSTCBX作为索引从数组OSMapTbl取得OSTCBBitY和OSTCBBitX的值,先说OSMapTbl数组的定义
INT8U const OSMapTbl[8] = {0x01, 0x02, 0x04, 0x08, 0x10,0x20, 0x40, 0x80};
用二进制表示如下
OSMapTbl[]的下标 |
OSMapTbl[](即位掩码) |
0 |
00000001 |
1 |
00000010 |