taskDelay(0)的特殊用法
2010-08-01 19:27阅读:
根据上一篇博文
http://blog.sina.cn/dpool/blog/s/blog_4ce2cdfa0100khrg.html?vt=4
可以知道:taskDelay(n)使调用该函数的任务延时n个tick(内核时钟周期)。该任务在指定的时间内主动放弃CPU,任务延时也常用于等待某一外部事件,作为一种定时/延时机制,而taskDelay(0)专用于任务调度(将CPU交给同一优先级的其他任务)。但是,taskDelay(0)时,同一优先级的任务中只有当前任务唯一一个呢?会发生什么问题?此时还有上下文切换吗?自己前换到自己?
其实,当调用taskDelay(0)时,首先,它不会导致更低优先级的任务获得CPU控制权;只有具有相同优先级的就绪任务时才会发生上下文切换。taskDelay(0)本质上是将当前任务放到该优先级队列的尾部,如果该任务是本队列中的唯一任务时,则该任务将保持CPU控制权。
taskDelay(0) --> Q_REMOVE & Q_PUT --> windExit():
taskCode:
if (taskIdCurrent == (WIND_TCB *) Q_FIRST (&readyQHead))
//说明队列中只有一个任务
if (!workQIsEmpty)
{
workQDoWork();
goto taskCode;
}
status = _sigCtxSave(&(tas
kIdCurrent->regs));
......
所以,taskDelay(0)时,同一优先级的任务中只有当前任务唯一一个,那么该任务将保持CPU控制权,并不发生上下文切换!!!