先解释几个变量:
OSRdyTbl []:任务就绪表。INT8U类型的数组,所有的优先级都保存在这个表中。
OSRdyGrp:INT8U类型的变量,辅助变量,用来表示任务就绪表的哪一组中有(一或多个)就绪的任务。
OSUnMapTal []:用来得出最高优先级的数组,每个下标都对应与之相等的INT8U数的最高优先位。
为了获取优先级别最高的就绪任务,我们不采取运算量大的遍历方式,而是采取通过 就绪组变量OSRdyGrp 和 就绪表OSRdyTbl[y] 导入到某表,得出优先位的方式快速获取。
原理:
既然0000,0010的最优先位是1;0010,0000的最优先位是5。那么就可以总结出优先位的数组,直接通过八位数就能得到优先位。
从0000,0000开始,到1111,1111结束,一共256种情况,将全部优先位按顺序列出。那么将0001,1010当作下标代入此表,得出的优先位就是1(从右往左数第二个)。
这个数组就是OSUnMapTal。数组的每一位都对应与此下标相等的INT8U类型数的最高优先位。
使用方法:
先将OSRdyGrp当作下标——OSUnMapTal[OSRdyGrp],得出最高就绪表中最高优先级所在的组数y。
将OSRdyTbl[y]当作下标——OSUnMapTal[OSRdyTbl[y]],得出最高优先组中的最高优先列x。
将y左移位,与x相加,就得到了最高优先级:
prio=(y<<3)+x.
|