前言
本文主要分析ucosiii中管理优先级表的os_prio.c文件。

正文
优先级表中每一个bit表示一个优先级,优先级表中某一个bit置位表示该优先级有就绪态的任务等待运行。其定义如下:
CPU_DATA OSPrioTbl[OS_PRIO_TBL_SIZE];
其中CPU_DATA是unsigned int类型数据;OS_PRIO_TBL_SIZE定义为
#define OS_PRIO_TBL_SIZE ((OS_CFG_PRIO_MAX - 1u) / (DEF_INT_CPU_NBR_BITS) + 1u)
也就是1,所以优先级表翻译过来就是:
unsigned int OSPrioTbl[1];
一个32位无符号的变量,它表示32个优先级。
优先级表相关的函数都在os_prio.c文件中,包括:
OS_PrioInit()初始化优先级列表(把OSPrioTbl清零)。
OS_PrioInsert()把优先级表中的某一位置位。
OS_PrioRemove()把优先级表中的某一位清零。
OS_PrioGetHighest()根据优先级表查找最高优先级。
接下来重点分析OS_PrioGetHighest(),其代码内容为:
OS_PRIO OS_PrioGetHighest (void)
{
CPU_DATA *p_tbl;
OS_PRIO prio;
prio = (OS_PRIO)0;
p_tbl = &OSPrioTbl[0]; //获取优先级表的首地址
while (*p_tbl == (CPU_DATA)0) {
//32位的遍历 找到不为0的32位 /* Search the bitmap table for the highest priority */
prio += DEF_INT_CPU_NBR_BITS; /* Compute the step of each CPU_DATA entry */
p_tbl++;
}
prio += (OS_PRIO)CPU_CntLeadZeros(*p_tbl); //计算前导0,如果汇编没有 就用二分查找法 /* Find the position of the first bit set at the entry */
return (prio);
}
比如优先级表二进制形式为10000000 00000000 00000000 00000000b那么OS_PrioGetHighest()函数返回的优先级数为0,
10010100 01000000 00000000 00000000b返回也是0
01010100 01000000 00000000 00000000b返回1
也就是返回第一个被置位的bit的位置。
其中调用的CPU_CntLeadZeros()函数用于快速找出32位变量中第一个被置位的bit位置。
为了提高查询速度,CPU_CntLeadZeros()用到了二分查找法和哈希表算法。
其代码如下:
CPU_DATA CPU_CntLeadZeros (CPU_INT32U val)
{
if (val > 0x0000FFFFu) {
if (val > 0x00FFFFFFu) {
ix = (CPU_DATA)(val >> 24u);
nbr_lead_zeros = (CPU_DATA)(CPU_CntLeadZerosTbl[ix] + 0u
uCOSIII优先级表解析

最低0.47元/天 解锁文章
2205

被折叠的 条评论
为什么被折叠?



