如何重新启动任务

How to restart a task

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

这是一个关于嵌入式系统中 RTOS 如何工作的一般性问题。

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

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

我的问题... 如果系统出现故障,而较低优先级任务在中间,例如步骤 2,而我们不想 运行 较低优先级任务中的其余步骤,那么我们如何完成它?

我的理解是,当调度程序准备好 运行 优先级较低的任务时,它将从系统故障前中断的地方继续。所以step3会被执行。

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

RTOS 不太可能支持您建议的机制,因为它的行为是不确定的。例如,这样的 RTOS 机制不知道任务中初始化的资源分配,也不知道简单地 "restart" 是否安全,或者如果不安全如何清理。

此外,RTOS 在机器指令级别抢占,而不是在逻辑功能之间抢占 "steps" - 无法确定它在进程中的位置。

任何此类机制都必须在应用程序级别而不是 RTOS 级别构建到任务的实现中,以便流程受到控制和确定。例如,您可能有这样的结构:

for(;;)
{
    step1() ;
    if( restart() )
    {
        clean_up() ;
        continue ;
    }

    step2() ;
    if( restart() )
    {
        clean_up() ;
        continue ;
    }

    step3() ;
}

故障 请求 重新启动,并在任务中重新启动有效或安全的特定点通过 restart() 轮询请求。 clean_up() 执行任何必要的资源管理,continue 导致跳转到任务循环的开始(在更复杂的情况下,可能会使用 goto,但这已经可能是个坏主意 - 不要让它变得更糟!)。

从根本上说,关键是您必须对任务进行编码以适当地处理故障,而 RTOS 无法"know" 什么是适当的。

虽然没有针对您所建议的通用 RTOS 机制,但也许可以实施一个框架来支持所需的行为,但它需要您将所有任务编写为由此类规定的特定模式框架 - 实施一个以简单方式处理资源清理的综合解决方案,但并非易事。

QNX Neutrino 有一个 "High Availability Framework" 例如支持进程重启和自动清理。它是可以做什么的示例,但它当然特定于该 RTOS。如果此行为对您的应用程序至关重要,那么您需要相应地 select 您的 RTOS,而不是依赖任何 RTOS 可用的 "traditional" 机制。