1. 前提
在ucos系统中,任务调度按照优先级调度算法,从就绪队列中选取优先级最高的任务进行调度。那么首先我们就要解决如何找到最高优先级的任务。
一种方法,我们可以从头到尾遍历就绪队列,找到优先级最高的任务。
另一种方法,我们要维护优先队列的顺序,按照优先级从高到低的顺序排列。
这两种方法效率不高,花费的时间也和当前任务数有关,具有不确定性。优先级位图算法就是一种确定性的就绪任务处理算法。
2. 优先级就绪表
首先我们需要一个二维表来保存各个优先级的任务,在ucos中,每个优先级只允许对应一个任务。
我们可以看到这个优先级就绪表的特点,越往上优先级越高,越往右优先级越高。我们可以这样我们可以利用位运算提升计算效率,例如35的二进制为00 100 011,我们取3-5位作为列坐标,6-8位作为行坐标,列坐标为100就是4,行坐标011就是3,可以看到正好对应就绪表中的35号窗格。
3. 任务进入就绪态
// OSRdyGrp:优先级就绪组 OSMapTbl:优先级映射表
OSRdyGrp |= OSMapTbl[priority >> 3];
// OSRdyTbl:优先级就绪表
OSRdyTbl[priority &