liushizhe 发表于 2013-10-30 18:19:18

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]
查看完整版本: ucos-iii时间轮番调度问题