11.0-uC/OS-III就绪列表(优先级)
准备运行的任务被放置于就绪列表中。就绪列表包括2个部分:位映像组包含了优先级信息,一个表包含了所有指向就绪任务的指针。
1.优先级
图6-1到6-3显示了优先级的位映像组。它的宽度取决于CPU_DATA的数据类型( 见CPU.H), 它可以是8位、 16位、 32位。根据处理器相应地设定。
uC/OS-III支持多达OS_CFG_PRIO_MAX种不同的优先级( 见OS_CFG.H)。在uC/OS-III中,数值越小优先级越高。因此优先级0是优先级最高的。优先级OS_CFG_PRIO_MAX-1的优先级最低。uC/OS-III将最低优先级唯一地分配给空闲任务,其它任务不允许被设置为这个优先级。 当任务准备好运行了, 根据任务的优先级, 位映像表中相应位就会被设置为1。如果处理器支持位清零指令CLZ, 这个指令会加快位映像表的设置过程。
OS_PRIO.C中包含了位映像表的设置、清除、查找的相关代码。这些函数都是uC/OS-III的内部函数,可以用汇编语言优化。
为了确定就绪列表中优先级最高的任务,位映像表会被扫描,通过OS_PrioGetHighest()函数找到优先级最高的任务。
( 1) .OS_PrioGetHighest()函数扫描OSPrioTbl[]表直到找到非0的记录。 这个循环最终会停止, 因为总是有非0记录( 空闲任务的存在)。
( 2) .当这个表中全是0记录时, 就会从下一个表中查找。 优先级”prio”会被增加(如果表长32位,就将prio加上32)。
( 3).当找到第一个非0位时,计算该位之前0位的个数,返回该优先级值。 如果CPU提供清零指令, 可以通过这个指令优化代码。如果CPU没有这个指令,那么这个指令就只能用C语言模拟了。
函数CPU_CntLeadZeros()统计了CPU_DATA记录中0的个数 ( 从
左边开始,以位计)。