【文件属性】:
文件名称:任务就绪表-倒数粗糙熵图像阈值化分割算法
文件大小:6.12MB
文件格式:PDF
更新时间:2021-06-09 11:16:17
UCOSIII 教程
5.5 任务就绪表
UCOSIII 中将已经就绪的任务放到任务就绪表里,任务就绪表有两部分:优先级位映射表
OSPrioTbl[]和就绪任务列表 OSRdyList[]。
5.5.1 优先级位映射表
当某一个任务就绪以后就会将优先级位映射表中相应的位置 1, 优先级位映射表如图 5.5.1
所示,该表元素的位宽度可以是 8 位,16 位或 32 位,根据 CPU_DATA(见 cpu.h)的不同而不同,
在 STM32F103 中我们定义 CPU_DATA 为 CPU_INT32U 类型的,即 32 位宽。UCOSIII 中任务
数目由宏 OS_CFG_PRIO_MAX 配置的(见 os_cfg.h)。
10 2 3 4 5 6 7 8 3130292826 27252423
······
······
······
······
······
OSPrioTbl[0]
OSPrioTbl[1]
OSPrioTbl[2]
OSPrioTbl[OS_PRIO_SIZE-1]
031
优先级:0~31
优先级:32~63
优先级:64~96
优先级:
OS_CFG_MAX32
~
OS_CFG_MAX-1
最高优先
级任务
最低优先
级任务
图 5.5.1 优先级位映射表
在图 5.5.1 中从左到右优先级逐渐降低,但是每个 OSPrioTbl[]数组的元素最低位在右,最
高为在左边,比如 OSPrioTbl[0]的 bit31 为最高优先级 0,bit0 为优先级 31。之所以这样做主要
是为了支持一条特殊的指令“计算前导零(CLZ)”,使用这条指令可以快速的找到最高优先级任
务。
有关于优先级的操作有 3个函数:OS_PrioGetHighest()、OS_PrioInsert()和OS_PrioRemove()。
分别为获取就绪表中最高优先级任务、将某个任务在就绪表中相对应的位置 1 和将某个任务在
就绪表中相对应的位清零,OS_PrioGetHighest()函数代码如下:
OS_PRIO OS_PrioGetHighest (void)
{
CPU_DATA *p_tbl;
OS_PRIO prio;
prio = (OS_PRIO)0;
p_tbl = &OSPrioTbl[0]; //从 OSPrioTbl[0]开始扫描映射表,一直到遇到非零项