uc/os的任务管理
uc/os每个任务被赋予不同的优先级等级,从0级到最低优先级OS_LOWEST_PRIO,包括0和OS_LOWEST_PRIO在内, uc/os总是在已经就绪的任务中选择一个任务来运行,为了了解那些任务出于就绪状态,uc/os在系统初始化的时候创建了一个供就绪任务登记的表,即就绪任务表。就绪任务表实际上为一个类型为INT8U的数组OSRdyTbl[],由 于每个任务在此数组中只占一位,所以数组的每一个元素可以表达8个任务的就绪状态。为了便于对就绪表的查找,uc/os又定义了一个数组类型为INT8的 OSRdyGrp,并使该数组的每一位都对应OSRdyTbl[]的一个任务组。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。例如OSRdyGrp=1100101,哪么意味着OSRdyTbl[0],OSRdyTbl[2],OSRdyTbl[6],OSRdyTbl[7]任务组中有任务就绪。
由于优先级是一个单字节的数字,且其最大值不超过63,因此可以把优先级看做是一个6位的二进制数,这样子可以用高三位表示OSRdyGrp的具体数据位,用低三位表示数组元素OSRdyTcl的具体数据位。
对于任务就绪表的操作主要有两项:添加,删除。
在任务就绪表中登记就绪任务的代码为:
OSRdyGrp |= OSMapTbl[prio >> 3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
从任务就绪表中删除任务的代码为:
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)
OSRdyGrp &= ~OSMapTbl[prio >> 3];
表 T3.1 OSMapTbl[]的值 |
|
Index |
Bit Mask (Binary) |