文件名称:任务就绪表-倒数粗糙熵图像阈值化分割算法
文件大小:6.12MB
文件格式:PDF
更新时间:2024-06-29 05:02:57
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]开始扫描映射表,一直到遇到非零项