【问题标题】:How can I implement a Hierarchical concurrent finite state machine in C (HCFSM)? [closed]如何在 C (HCFSM) 中实现分层并发有限状态机? [关闭]
【发布时间】:2017-12-10 01:56:50
【问题描述】:

我正在使用 FSM 对我正在开发的嵌入式系统的行为进行建模。经过一些初步测试后,我有一个用 C 编码的 FSM 运行良好。我用来编写 FSM 的方法是指针函数表,我在其中定义了一个表,其中包含在每个状态中发生的所有函数。

void(*state_table[])(void) = {
conection,
Idle,
cal,
bi,
pot,
gal,
eis,
PrepE,
Pret,
Meas,
FS_ch,
Ending,
Error };

现在下一步是对一些使用第一种方法无法解决的复杂需求进行建模。在这个新模型中,我想使用一些并发性来对两个应该“同时”工作的 FSM 进行建模,并且我还使用了一些层次结构来将这些 FSM 置于一个超状态中。

我现在遇到的问题是,我不确定如何使用 C 编写这种并发和层次结构。我正在查看 QP 框架,但我认为我的 FSM 还没有那么复杂,无法开始使用这些框架。

这是我设计的 FSM。 状态 71 和 72 是超状态 7 中的并发状态。它们之间的执行是完全独立的,它们不共享任何变量。

如何使用 C 实现这种并发性和层次结构?

【问题讨论】:

  • 你可以观看传播器的概念来实现并发。 groups.csail.mit.edu/mac/users/gjs/propagators
  • 你在使用 RTOS 吗?
  • 为什么不将它们也编码为函数指针数组?
  • 是的,还有两个相同结构的表。作为状态机,它们将同时运行。如果您从它们的超状态处理程序调用两个表的状态。状态机背后的想法是在单线程系统中模拟并发。
  • @GauravPathak 不,我希望尽可能简单。所以 RTOS 现在不是我的选择。

标签: c embedded stm32 fsm


【解决方案1】:

外部状态机在一个连续的循环中运行,而子状态和子状态机必须运行到完成。在没有抢占式调度器的情况下,并发必须协同实现——“并发”状态必须按顺序执行,但每个状态都应该在每次调用时执行确定性的保证完成操作——即没有无限期的忙等待或延迟或处理花费比您的实时约束更长的时间(这在任何情况下都是状态机约束的基础)。

子状态机可以以与主状态机相同的方式实现,但没有“大循环”。例如:

// Main state machine
static int current_state0 = 0 ;
int main( void )
{
    static const void(*state_table[])(void) = 
    {
        conection,
        Idle,
        cal,
        bi,
        pot,
        gal,
        eis,
        PrepE,
        Pret,
        Meas,
        FS_ch,
        Ending,
        Error 
    } ;

    // Main loop - execute the current state
    for(;;)
    {
        state_table[current_state0]() ;
    }
}

void superState7()
{
    // Execute concurrent sub-statemachines
    subStateMachine71() ;
    subStateMachine72() ;
}


// Sub-state machine
static int current_state71 = 0 ;
void subStateMachine71()
{
    static const void(*state_table[])(void) = 
    {
        state711,
        state712,
        state713,
        state714
    } ;

    // Execute current substate
    state_table[current_state71]() ;
}

...

【讨论】:

  • 感谢克利福德。我正在用你的想法制作一个 FSM 骨架,这很有意义。我会在接下来的几天里测试它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
相关资源
最近更新 更多