如何重新启动任务

时间:2019-02-11 21:29:14

标签: embedded task rtos

如何从高优先级任务重新启动低优先级任务?

这是关于嵌入式系统中RTOS如何工作的普遍问题。

我有多项任务具有不同的优先级。优先级较低的任务具有某些步骤,例如step1,step2,step3。

最高优先级的任务处理系统故障。如果发生故障,则系统中的ISR将导致优先级更高的任务立即运行。

我的问题... 如果在较低优先级任务位于中间(例如,步骤2)时发生系统故障,而我们又不想运行较低优先级任务的其余步骤,那么我们该如何完成呢?

我的理解是,当调度程序准备好运行优先级较低的任务时,它将在系统出现故障之前从中断处继续执行。因此,将执行步骤3。

嵌入式RTOS(例如Keil RTX或FreeRTOS)是否提供了这样的机制,以便在来自较高优先级任务/ ISR的某些信号上,较低优先级任务可以重新启动?

1 个答案:

答案 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可用的“传统”机制。