ucosiii任务切换条件

2015-11-09 21:13 阅读 906 次 评论 0 条

这个日志是ucosiii user's manual pdf文件Page140的翻译。

任务切换不需要用户程序进行特殊操作,在下面描述的情况下会自动进行任务切换。

一个任务产生信号或发送消息到另一个任务

当一个任务产生信号或发送消息通过post函数,如OS???Post()。在OS???Post()结束时产生任务切换。注意:任务在任务OS???Post()函数中指明OS_OPT_POST_NO_SCHED参数,将不会产生任务切换。

任务调用OSTimeDly()or OSTimeDlyHMSM()

如果延时设置的值非零,主调任务将进入等待任务列表等待超时,任务切换将产生。任务切换在主调任务进入等待列表就发生,并且将产生上下文(context)换到任务就绪列表中同优先级或低优先级任务。

任务等待事件发生而事件还没有发生

当OS???Pend()函数调用。主调任务进入等待列表等待事件发生,如果指定了非零的超时参数,主调任务将一直等待直到超时。任务调度将调用最重要的任务运行。

任务放弃等待

另一个任务调用OS???PendAbort()一个任务可以放弃等待。当指定的内核对象从等待列表删除时,将产生任务切换。

任务创建时

新任务创建被分配的优先级比创建该任务的任务优先级更高,将产生任务切换。

任务删除

当中止一个任务,如果当前任务被删除,将产生任务切换。

内核对象被删除

如何删除一个事件标志组、信号量、消息队列或互斥信号量,如何任务等待这些内核对象,这些任务任务将被置为就绪运行,并且任务切换将产生。判定任务比此删除任务更高优先级的任务,这些高优先级的任务将被通知内核对象被删除了。

任务改变了自身或其它任务优先级

当一个任务改变了自身或其它任务优先级,而此新改的优先级比原优先级高时,将产生任务切换。

任务挂起(suspend)自身通过调用OSTaskSuspend()

当任务调用OSTaskSuspend()挂起将不再执行,任务切换将发生。挂起的任务必须被其它任务恢复。

被OSTaskSuspend()挂起的任务被其它任务恢复

当被OSTaskSuspend()挂起的任务被其它任务恢复时,任务切换将产生

在嵌套ISRs的结束

在嵌套的中断服务程序结束后,将通过任务切换判定更重要的就绪运行的中断服务函数。这个任务调用是通过OSIntExit()函数代替了OSSched()。

调度器被解锁通过调用OSSchedUnlock()

在调度器锁定后被解锁。调度器锁定可以嵌套使用,必须有相应的解锁调用。

任务放弃时间片通过调用OSSchedRoundRobinYield()

假设任务运行在其它任务同优先级,任务可以放弃时间片,让其它任务运行。

用户调用OSSched()

应用程序调用OSSched()产生任务切换。当OS???Post()函数指定OS_OPT_POST_NO_SCHED参数,将使多个post完成而不调用任务切换。当然在这个情况下,可以在最后一个post中不使用OS_OPT_POST_NO_SCHED参数。

从上面的说明可以看出,任务切换有些情况是必发生的,而有些情况是有条件产生。在程序调试的时候,可以查看为什么有些不跑了。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:ucosiii任务切换条件 | 起点博客
分类:应用笔记 标签:

发表评论


表情