uCOS获取任务就绪表最高优先级,OSUnMapTal的原理和应用。

先解释几个变量:

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.

 

你可能感兴趣的:(uCOS获取任务就绪表最高优先级,OSUnMapTal的原理和应用。)