因为最近想在 stm32 上跑操作系统,所以开始学习 uC/OS-II。正好这学期有嵌入式实时操作系统这门课,但上课的教材内容是广义上的嵌入式实时操作系统,所以我在图书馆借了任哲老师的这本“嵌入式实时操作系统 uC/OS-II 原理及应用”这本书。
最近看到任务就绪表及任务调度这部分,关于对任务就绪表的操作主要包括登记、注销和从就绪表的就绪任务中找到优先级最高的任务。
根据书本上的内容对任务的登记和注销的代码是比较好理解的,比较难理解的是查找优先级最高任务的算法。
再查找优先级最高的任务时,用到了 OSRdyGrp 这个变量,OSRdyTbl 这个数组以及 OSUnMapTbl 这个用于查找的数组,前面两个的含义书上都有讲,主要是对于那个用于查找的数组的用法不太清楚。
用于查找优先级最高就绪任务的代码很简单,如下:
y = OSUnMapTbl[OSRdyGrp]
x = OSUnMapTbl[OSRdyTbl[y]]
prio = (y << 3) + x
y 是优先级的高三位,x 是优先级的第三位。
OSUnMapTbl 数组如下: