如何从高优先级任务重新启动低优先级任务?
这是一个关于嵌入式系统中的RTOS如何工作的一般性问题。
我有不同优先级的多项任务。低优先级任务有一定的步骤,如step1、step2、step3。
优先级最高的任务处理系统故障。如果发生故障,系统中的ISR将导致更高优先级的任务立即运行。
我的问题..。如果系统故障发生时,低优先级的任务在中间,例如,step2和我们不想运行其余的步骤,在低优先级的任务,那么我们如何完成它?
我的理解是,当调度程序准备运行较低优先级的任务时,它将从系统故障之前停止的位置继续运行。因此,step3将被执行。
嵌入式实时操作系统(例如,Keil或FreeRTOS)是否提供了这样一种机制,以便在来自高优先级任务/ISR的某些信号上,低优先级任务可以重新启动?
发布于 2019-02-12 12:14:42
您所建议的机制不太可能得到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中微子有一个支持进程重新启动和自动清理的“高可用性框架”。这是一个例子,可以做什么,但它当然是特定于该实时操作系统。如果这种行为对您的应用程序至关重要,那么您需要相应地选择RTOS,而不是依赖任何RTOS可用的“传统”机制。
https://stackoverflow.com/questions/54639436
复制相似问题