如何从高优先级任务重新启动低优先级任务?
这是关于嵌入式系统中RTOS如何工作的普遍问题。
我有多项任务具有不同的优先级。优先级较低的任务具有某些步骤,例如step1,step2,step3。
最高优先级的任务处理系统故障。如果发生故障,则系统中的ISR将导致优先级更高的任务立即运行。
我的问题... 如果在较低优先级任务位于中间(例如,步骤2)时发生系统故障,而我们又不想运行较低优先级任务的其余步骤,那么我们该如何完成呢?
我的理解是,当调度程序准备好运行优先级较低的任务时,它将在系统出现故障之前从中断处继续执行。因此,将执行步骤3。
嵌入式RTOS(例如Keil RTX或FreeRTOS)是否提供了这样的机制,以便在来自较高优先级任务/ ISR的某些信号上,较低优先级任务可以重新启动?
答案 0 :(得分:0)
您建议的机制不太可能受RTOS支持,因为它的行为是不确定的。例如,这样的RTOS机制将不知道要在任务中进行初始化的资源分配,也不知道简单地“重新启动”是否安全,或者如果不这样做则如何清除。
此外,RTOS在机器指令级别上占先,而不是在逻辑功能“步骤”之间-不能确定其在过程中的位置。
任何这样的机制都必须在应用程序级别而不是RTOS级别的任务实现中内置,以便对过程进行控制和确定性。例如,您可能具有以下结构:
for(;;)
{
step1() ;
if( restart() )
{
clean_up() ;
continue ;
}
step2() ;
if( restart() )
{
clean_up() ;
continue ;
}
step3() ;
}
故障请求重新启动,并且通过restart()
在重新启动有效或安全的任务中的特定点轮询请求。 clean_up()
执行任何必要的资源管理,并且continue
导致跳转到任务循环的开始(在更复杂的情况下,可以使用goto
,但这已经是可能是个坏主意-不要让它变得更糟!)。
最重要的是,您必须对任务进行编码以适当地处理故障,而RTOS无法“知道”什么是适当的。
虽然您所建议的没有通用的RTOS机制,但也许可以实现一个框架来支持所需的行为,但是这将要求您将所有任务编写为该框架规定的特定模式-实施以简单方式处理资源清理的综合解决方案并非易事。
例如,QNX Neutrino具有"High Availability Framework",它支持进程重新启动和自动清除。这是可以做什么的一个例子,但是它当然是特定于该RTOS的。如果此行为对您的应用程序至关重要,则您需要相应地选择RTOS,而不是依赖于任何RTOS可用的“传统”机制。