Newtank

个人站

欢迎来到我的个人站~


μCOS-Ⅱ

目录

μ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