|
看了下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已经匹配了,为什么?
晕,打了这么多,突然好像找到问题了,在这个函数里面,算是自问自答
void OS_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先运行。
}
}
描述不是很清新,不知道是不是这样,忘对这了解的朋友帮忙下。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|