μC/OS-Ⅱ
任务控制块
任务控制块TCB包括类似进程控制块的内容,包括任务堆栈指针、任务ID、任务优先级、任务链表指针等
栈指针
- 栈顶指针
- 栈底指针
链表指针
所有的TCB分属于两条:单向的空闲链表和双向的使用链表
任务就绪表
每个任务的就绪态标志放在任务就绪表。表中有两个变量OSRdyGrp和OSRdyTbl[]。
在Grp中,任务按优先级分组,8个一组。其每一位表示每一组是否有进入就绪态的任务。任务进入就绪态时,其Tbl[]的对应位和Grp的对应组位置1。
对于一个任务,其6为优先级数的低三位为在组内的位置,中三位为所在组号。优先级数越低的优先级越高
任务调度
μC/OS-Ⅱ不支持时间片流转,总是运行优先级最高的任务
根据就绪表确定当前最高优先级:
- 分解为高三位和低三位
- 通过Grp确定组号。假设OSRdyGrp=0x08,第三位为1,则最高优先级的高三位为011(3)
- 通过Tbl[3]确定低三位。假设OSRdyTbl[3]=0x3a,第1位为1,则优先级低三位为001,最高优先级为011001(25)
可用通过OSUnMapTbl[]来方便的计算最高优先级
实质上,OSUnMapTbl[x]=x中第一个1位的下标
y = OSUnMapTbl[OSRdyGrp]
x = OSUnMapTbl[OSRdyTbl[y]]
prio = (y << 3) + x
例如Grp的值为0x68,查表得y=3,即最高优先级在第三组。
OSRdyTbl[3]的值为0xe4,查表得2,即最高优先级在第二个。则最高优先级为0x32