为什么RTOS任务必须在无限循环中执行?

ann*_*ena 8 c rtos

嗨,我是RTOS中的新手,几乎每个我读过的文档,都表明任务必须是无限循环,但没有说明原因.有人可以帮忙解释一下吗?谢谢

kkr*_*mbo 7

我认为"RTOS任务必须是无限循环"并不完全准确.我认为更正确的说法是"对于许多RTOS,任务一定不能返回 ".这样做的原因是最初调用任务的RTOS调度程序不是为处理任务返回而设计的.如果任务确实返回,则RTOS调度程序可能会声明错误.

我可以猜测为什么许多RTOS调度程序不处理任务返回的原因.首先,无限循环是嵌入式系统中实现的最典型的任务类型.结束的任务不太常见.其次,RTOS调度程序可能必须更复杂才能处理返回的任务.第三,RTOS设计者可能不想假设任务返回时应该做什么,而是希望任务设计者明确地调用适当的任务终止例程.

对于许多不允许任务返回的RTOS,无限循环不是唯一的解决方案.RTOS可以提供​​任务终止例程,该例程从任务列表中删除任务,以便从不再次调度它.如果任务调用任务终止例程,则任务不必是无限循环,也不会返回给它的调用者.(即,RTOS任务终止例程不返回,因此调用它的任务也不会返回.)例如,FreeRTOS具有vTaskDelete(),而uC/OS-II具有OSTaskDel(),用于删除非无限循环的任务.

无限循环是嵌入式系统中常见的任务类型,因为许多嵌入式系统只是一遍又一遍地做同样的事情.许多嵌入式系统与PC不同,因为它们没有用户与它们交互,启动和终止各种任务或应用程序.


Cli*_*ord 5

他们不会,但如果任务功能运行完成,则任务将终止。

您也许可以选择在每次需要时实例化一个新的运行到完成任务,但实例化任务非常耗时且可能具有不确定性,因此不适合硬实时响应。让任务等待某个阻塞对象(例如事件、信号量或计时器)会更有效和更灵敏,这样它就可以在每次需要时确定性地响应。另一方面,如果您有许多不同的非实时任务,只需要偶尔运行,运行到完成模式可以节省资源。

然而,至少有一项任务需要无限期地运行——如果一切都停止了,您的系统将不会做任何事情,直到电源被循环或重置(例如通过看门狗定时器)。

RTOS 实现各不相同,您需要检查您的 RTOS 如何处理终止线程功能。您可能需要显式终止调用以确保内核释放资源。

如果您的系统需要某种形式的受控优雅关闭,您不需要将任务编码为无限循环,而是有条件地退出循环,以便任务可以根据请求终止,例如;

while( (event_flags & TERMINATE) == 0 )
{
    event_flags = eventWait( WAIT_FOREVER ) ;

    // handle events
    ...
}
Run Code Online (Sandbox Code Playgroud)