【问题标题】:What is a good way to implement state-machine-like transitions in FreeRTOS?在 FreeRTOS 中实现类似状态机的转换的好方法是什么?
【发布时间】:2021-12-27 23:16:01
【问题描述】:

很明显,机器的状态会被抽象成任务,但是如何控制转换呢?

我正在寻找的功能是一次只有一个状态任务处于活动状态,而其余状态任务则处于阻塞状态。正在运行的任务必须自己阻塞,并在状态转换模型中解除阻塞下一个任务。

我想到的方法是为每个任务创建一个二进制信号量的索引数组,然后简单地给要转换到的任务的信号量。

或者,我可以在一个任务中处理所有状态机功能,并控制哪些功能由 switch 语句执行?

哪种做法更有效或更好?

【问题讨论】:

  • 单独任务中的状态机有点意思。
  • 我同意@0__________ .. 这没有多大意义。但是,如果您仍然想这样做,请检查 xTaskNotify() 函数,以将事件发送到任务。
  • 很明显,机器的状态将被抽象为任务”——这一点都不清楚,任务不是状态。通常你会在一个任务中实现一个状态机within,并使用任务同时运行多个这样的状态机。这允许您运行更简单、更有凝聚力的状态机,而不是使用状态机作为调度手段。它也是在状态机中实现并发的一种方式。将任务用作离散的非并发状态没有任何意义。可以使用诸如事件标志之类的 RTOS IPC 机制在此类状态机之间交换事件

标签: c embedded freertos


【解决方案1】:

不确定 SO 是否适合问这个问题,因为这是一个非常普遍的问题。无论如何:恕我直言,最简单的入门方法是利用现有工具,在这种情况下为状态机设计模式。 C 不是实现它的完美语言,但可以做到,例如:https://stackoverflow.com/a/44955234/4885321https://www.adamtornhill.com/Patterns%20in%20C%202,%20STATE.pdf 在 FreeRTOS 的上下文中,FSM 很可能最终会成为单个任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2018-02-19
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多