ucos-iii时间轮番调度问题
看了下ucos-iii源码,有一个地方不理解。假设有2个任务,task1和task2,这2个任务的优先级相同,因此用到时间片轮番调度。task1、task2伪代码如下:void task1()
{
.....
OSTimeDly(10, );
}
void task2()
{
.....
OSTimeDly(1000, );
}
同时在创建任务时task1的TimeQuantaCtr参数开始时(每次查询时减1)为1000,而task2为10.因此此时就有一个问题不理解了,task1比task2延时时间短,通常都是task1先使该优先级的任务进入就绪状态,但是在时间片查询时,由于task2的TimeQuantaCtr值先减到0,然后task2就放到任务就绪表头,也就说task2会先task1运行,照理说task1先task2运行,因为是task1的tick已经匹配了,为什么?
晕,打了这么多,突然好像找到问题了,在这个函数里面,算是自问自答
voidOS_RdyListInsert (OS_TCB*p_tcb)
{
OS_PrioInsert(p_tcb->Prio);
if (p_tcb->Prio == OSPrioCur) { /* Are we readying a task at the same prio? */
OS_RdyListInsertTail(p_tcb); /* Yes, insert readied task at the end of the list */
} else {
OS_RdyListInsertHead(p_tcb); /* No,insert readied task at the beginning of the list*/若当前运行的任务不是task2,在这边将task1放在任务就绪表头的(OS_RDY_LIST),所以任务调度时task1先运行。
}
}
描述不是很清新,不知道是不是这样,忘对这了解的朋友帮忙下。
页:
[1]