有人移植了Arduino的QP状态框架吗?


12

在回顾我的数据记录项目的可能方法时,我发现“ C / C ++中的实用UML状态图”一书对于与Arduino进行更认真的工作非常有趣。QP是面向嵌入式系统的基于状态机的超轻型开源框架家族,它们在http://www.state-machine.com/上为其框架(GNU GPL2)分发代码和端口,其中它们具有一个使用WinAVR / Gnu C ++工具集的AVR和AVR mega的端口。

尽管特定于芯片的接头连接器合适,但是否有人创建了板BSP文件或对这些框架有任何经验?我只是从这本书开始,所以任何评论都将不胜感激。


贾森·S(Jason S)关于提供+1提及QP状态字符的评论的+1。哦,星号也+1了一个话题...因为听起来很时髦,我期待回答:P(对垃圾邮件表示抱歉,今天的心情很有趣;))
cyphunk

Answers:


4

我会避免像瘟疫这样的事情。

我遇到过的大多数“严重”低级软件都是这种形式的状态机:

#include <stdio.h>

typedef enum
{
    STATE_INIT,     // Description
    STATE_RUNNING,  // Description
    STATE_COMPLETE  // Description
} state_t;

int main(void)
{
    state_t state = STATE_INIT; // setup the initial state

    while(1)
    {
        os_run(); // call the OS services (poll the UART, check buttons, etc.)

        switch(state)
        {
            case STATE_INIT:
                state = STATE_RUNNING;
                puts("init");
                break;
            case STATE_RUNNING:
                state = STATE_COMPLETE;
                puts("running");
                break;
            case STATE_COMPLETE:
                puts("complete");
                break;
        }
    }
    return 0;
}

C / C ++中还有许多其他好的方法,但是它们不是我的最爱。

QP之类的工具的最大问题是,通常很难做他们不希望您做的事情。如果确实选择手动处理代码,则必须永远保持特殊情况。

我会说,UML状态图是用于文档,教学和分析的绝佳工具。但是,不是用于实际编程的-有更好的工具:)


1
如果您的代码是专有的,请不要忘记QP的许可费用。
mjh2007'3

1
状态机代码的微小改进:它通常有助于提高可靠性,以使状态更改排队,并且仅在switch语句之前更改实际状态。这样,您不必担心在将状态更改为STATE_COMPLETE之后立即将状态更改为STATE_INIT的问题。
AngryEE 2010年

3

由于GPL许可证,我个人没有使用过QP框架/库。当时,我不认为我的雇主愿意为我准备使用QP的HSM(分层状态机)进行试验。当我重构一个糟糕的状态机时,我不得不实现自己的类似于QP的状态机,该状态机占用了数百行代码,如Joby的示例,但乘以1000。很难维持。我害怕尝试添加新内容,以免破坏其他内容。

我将代码重新设计为HSM,对我个人而言,系统的行为方式更有意义。它的工作远比我想象的要好。修改和维护起来非常容易,这是我梦dream以求的。由于系统中的意外行为,我什至不得不几乎重做很多状态机。使用我制作的框架要容易得多,而且我敢肯定,在QP中也是如此。我构建的框架变得很流行,并扩展到了代码库中的其他一些复杂状态机。

我确实有一个朋友在一个效果很好的机器人中使用Java实现了量子框架。它是基于某些输入的机器人决策算法的一部分。考虑到它必须根据机器人的状态做出决定,这很自然。

我了解QP的优点在于,它具有为状态机设计准备好的框架的能力,该状态机设计针对您的处理器进行了优化,而不必依赖CASE工具吐出低效的样板代码。但是,只有在您有一组复杂的状态机来实现描述设计的情况下,我才使用QP。

如果您所拥有的只是乔比的例子那么简单,那么就按照他的解释做吧。但是,如果您发现状态机随着围绕不同条件的各种“ if else”语句的增长而增长……那么可能是时候尝试像QP这样的东西将其分解为HSM了。


1

在Joby的示例上进行扩展,实现大型状态机的一种更简洁的方法是用函数指针数组替换case语句。然后,您可以隔离函数内特定状态的所有代码。我发现以这种方式实现它需要更少的程序内存。


1

用函数指针数组替换case语句

QP的工作方式是这样的。状态的表示只是一个函数指针(指向当前状态的函数)。在C ++中,它可能是指向成员函数的指针,但基本相同。当前状态函数与事件以及一些伪事件(进入,退出)一起调用,其中之一始终未处理,用于在执行嵌套转换时确定状态嵌套(QP支持分层状态机)。

Miro Samek说他将很快做一个针对Arduino的端口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.