FOS调度算法是基于优先级任务调度的,对于优先级任务支持FIFO策略。应该说所有真实时的操作系统都支持基于优先级任务调度。
调度算法的作用是找出可调度优先级最高的的任务。
FOS 采用一个unsignedint类型的变量task_prio_map,来维护各任务的优先级情况。任务数有大,优先级越低。在系统初始化时,建立起每个优先级链表头,每当有任务创建的时候,根据该任务的优先级把该任务插入相对应的优先级链表后面。同等优先级支持FIFO调度方式。
函数是提TCB*bit_first_one_search(U32 num),取出可以调度最高优先级任务。
TCB *bit_first_one_search(U32 num)
{
U8 i = 0;
LIST*prio_list_head;
TCB *tmp;
while(i < 32) {
if ((num >>i) & 0x01) {
prio_list_head = &task_prio_queue[i].list;
tmp =list_entry( prio_list_head->next, TCB, list);
if(tmp->state == 0) {
;
} else {
returntmp;
}
}
i++;
}
if (old_task->state== 0)
return idle_task;
return old_task;
}
算法描述,检查num某bit上是否为1,是查看该对应优先级链表上的任务是否可以运行。总是先提取该链表的头部后面一个,在其他处理中,同等优先级不可运行的任务,总是拍到链表后面。
如果该链表上所有的任务不可以运行,就继续向下查找num中下一个bit为1,重复上面操作。到最后,确实没有可以运行的任务,那就运行旧任务,旧任务也不可以运行,那就运行空闲任务。