由任务就绪表OSRdyTbl和任务就绪组OSRdyGrb组成,OSRdyTbl每一个位都记录着一个任务的就绪状态,
0非就绪1就绪,OSRdyGrb是为了快速的找出当前的最高就绪任务而设置的,把就绪表中的八个任务状态分为 一组,当这个组中有就绪状态的任务时,就在OSRdyGrb中相应的位置1.
●就绪表登记任务
更改任务状态要做两个操作,一个事把任务就绪表中的相应位置1,一个事把相应的任务就绪组置1
代码:
OSRdyGrp|=OSMapTbl[prio>>3];
OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];
第一个操作,prio>>3意思是除以prio/8,这样就正好是prio在任务就绪组中的第几位,然后为了方便给OSRdyGrp赋值,有一个OSMapTbl.
第二个操作prio>>3找到OSRdyTbl中第几组,然后prio&0x07,就是prio%8,找出在该组的第几位.
●删除就绪任务
删除就绪任务时首先给任务就绪表相应位置0,然后判断该组是否为零,意思是该任务组没有就绪任务了,然后给相应的任务就绪组置0;
if((OSRdyTbl[Prio>>3])&==~OSMapTbl[prio&0x07])==0)
OSRdyGrp|=~OSMapTbl[prio>>3];
●查找最高就绪任务(经典的以空间换时间)
①y=OSUnMapTb1[OSRdyGrp];
x=OSUnMapTbl[OSRdyTb1[y]];
prio=(y<<3)+x;
或②
y=OSUnMapTb1[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y<<3)+OSUnMapTb1[OSRdyTb1[y]]);
这操作应该属于数学问题,用一个数组来枚举出现的结果.