如何重新启动任务
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" 机制。
如何从高优先级任务重新启动低优先级任务?
这是一个关于嵌入式系统中 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" 机制。