新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Cortex-M3的μC/OS-II任务调度硬件指令实现

Cortex-M3的μC/OS-II任务调度硬件指令实现

作者:时间:2011-03-24来源:网络收藏

1.2 高优先级的查找
就绪表中查找最高优先级,即从OSRdyTb1[]变量中找到最低为1的位是第几位(对应的就是最高优先级任务)。μC/采用查表的方式来找出处于就绪态的最高优先级任务,μC/中有一张256个单元的数据表OSUnMapTb1[],表中按一定规律有128个O,64个1,32个2,16个3,8个4,4个5,2个6,1个7,还有1个0,共256字节。OSUnMapTb1[]的定义如下所示:
d.jpg
找出进入就绪态的最高优先级任务的代码如下:
e.jpg
f.jpg
初看这张表感觉杂乱无章,实际是很有规律的。以“OSUnMapTb1[0]~OSUnMapTb1[15]:0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x00~0x0F*/”为例说明:
g.jpg
其他依次类推。
下面再以一个实例进行说明:假设变量OSRdyGrp=01011000B,表示变量OSRdyTb1[3]、OSRdyTb1[4]、OSRdyTb1[6]有任务处于就绪状态,任务是去查找最高优先级任务(y=OSUnMapTb1[0x58])。由于OSRdyTb1[3]>OSRdyTb1[4]>OSRdyTb1[6],结果y=3。如果OSRdyTb1[3]=1000 0001B,则通过查表x=OS-UnMapTb1[OSRdyTb1[3]],即可得到x=O,表明这组数中第0位为1处于最优状态。这样,prio=(y3)+x=(33)+0=24。再利用这个优先级的值,查找任务控制块优先级表OSTCBPrioTb1[],得到指向任务的任务控制块OS_TCB。

2 中μC/任务
采用精简集,采用Thumb-2,其中包括基于RTOS的算法(CLZ),可以通过这种指令查找处于就绪态的最高优先级任务。μC/OS-II中任务的就绪态是反映在OSRdyTb1[]变量中,共计8字节(64位),对应64个任务。可以将其折分成两个32位的数据,然后分别查找这两个32位的数据中优先级最高的任务。先查找低32位,如果低32位中不为零,则找出其中最高优先级任务;否则查找高32位,找出其中最高优先级任务,高32位的的查找结果应加上数值32。
Cotrex-M3中通过以下两条指令就可完成最高优先级任务的定位:RBIT和CLZ。RBIT的含义是把一个32位数据水平旋转180°;CLZ的含义是计算前导零的个数。


评论


相关推荐

技术专区

关闭