为系统中处于就绪状态的任务分配CPU是多任务操作系统的核心。这项工作涉及两项技术:一是判断哪些任务处于就绪状态;二是进行任务调度。所谓任务调度就是通过一个算法在就绪任务中确定应该马上执行的任务,操作系统用于负责这项工作的程序模块叫做调度器。
对任务就绪表的操作
登记:
对任务就绪表主要有三个操作:登记、注销、和从就绪表的就绪任务中得知具有最高优先级别的任务的标识(优先级prio)
在程序中,课用类似下面的代码把优先级别为prio的任务布置为就绪状态:
OSRdyGrp |= OSMapTbl[prio >> 3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
注销:当某个任务需要脱离就绪状态时,系统在就绪表中将该任务对应位置0。
如果要使一个优先级别为prio的任务脱离就绪状态,则可使用如下代码:
if((OSRdyTbl[prio >> 3] & = -OSMapTbl[prio & 0x07] == 0)
{
OSRdyGrp &= -OSMapTbl[prio >> 3];
}
最高优先级的就绪任务查找
y = OSUnMapTal[OSRdyGrp];//获得优先级别的D5,D4,D3位
x = OSUnMapTal[OSRdyTbl[y]];//获得优先级别的D2,D1,D0位
prio = (y << 3) + x;//获得就绪任务的优先级别
ucos是一个实时操作系统,在操作时间上他的所有操作都必须是常量,用通俗的话来讲“任何操作系统都必须在时间轴上承诺”,而循环程序是不能达到要求的。
任务调度
ucos任务调度的具体思想是:近似的每时每刻让优先级最高的就绪任务处于运行状态。在具体做法上,它在系统或者用户调用系统函数及执行中断服务程序结束时来调用调度器,已确定应该运行的任务并运行它。
ucos有两种调度器:
1、任务级的调度器 由函数OSSched()实现
2、中断级的调度器 由函数OSIntExt()来实现
关于调度器在任务就绪表中查找具最高优先级别的就绪代码,在上面已经叙述。
任务调度器的工作分为两个步骤:
1、获取待运行任务的TCB指针;
2、进行断点数据的切换