首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新启动任务

如何重新启动任务
EN

Stack Overflow用户
提问于 2019-02-11 21:29:13
回答 1查看 503关注 0票数 0

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

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

我有不同优先级的多项任务。低优先级任务有一定的步骤,如step1、step2、step3。

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

我的问题..。如果系统故障发生时,低优先级的任务在中间,例如,step2和我们不想运行其余的步骤,在低优先级的任务,那么我们如何完成它?

我的理解是,当调度程序准备运行较低优先级的任务时,它将从系统故障之前停止的位置继续运行。因此,step3将被执行。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-12 12:14:42

您所建议的机制不太可能得到RTOS的支持,因为它的行为是不确定的。例如,这样的实时操作系统机制将不知道在任务中初始化的资源分配,以及简单地“重新启动”是否安全,或者如果不安全的话如何清理。

此外,RTOS在机器指令级别抢占,而不是在逻辑功能“步骤”之间-没有确定它在进程中的位置。

任何这样的机制都必须内置到任务的应用程序级而不是RTOS级的实现中,这样才能控制和确定进程。例如,您可能有一个结构,如:

代码语言:javascript
复制
for(;;)
{
    step1() ;
    if( restart() )
    {
        clean_up() ;
        continue ;
    }

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

    step3() ;
}

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

从根本上讲,关键是您必须对任务进行编码,以适当地处理故障,而RTOS无法“知道”什么是合适的。

虽然对于您建议的内容没有通用的RTOS机制,但也许可以实现一个框架来支持所需的行为,但是它需要您将所有的任务写入这样一个框架所规定的特定模式--实现一个以简单方式处理资源清理的全面解决方案,但这并不是一件简单的事情。

例如,QNX中微子有一个支持进程重新启动和自动清理的“高可用性框架”。这是一个例子,可以做什么,但它当然是特定于该实时操作系统。如果这种行为对您的应用程序至关重要,那么您需要相应地选择RTOS,而不是依赖任何RTOS可用的“传统”机制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54639436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档