首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用C实现分层并发有限状态机(HCFSM)?

问如何用C实现分层并发有限状态机(HCFSM)?
EN

Stack Overflow用户
提问于 2017-07-06 15:32:38
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
复制
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实现这种并发性和层次化?

EN

回答 1

Stack Overflow用户

发布于 2017-07-06 18:38:08

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

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

代码语言:javascript
复制
// 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]() ;
}

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

https://stackoverflow.com/questions/44942471

复制
相关文章

相似问题

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