誰かがArduinoのQP状態フレームワークを移植しましたか?


12

データロギングプロジェクトの可能なアプローチを検討する中で、「C / C ++の実用的なUMLステートチャート」という本は、Arduinoとのより深刻な作業にとって非常に興味深いことがわかりました。QPは、組み込みシステム向けの超軽量、オープンソース、ステートマシンベースのフレームワークのファミリであり、http: //www.state-machine.com/でフレームワーク(GNU GPL2)のコードとポートを配布します。 WinAVR / Gnu C ++ツールセットを使用したAVRおよびAVR megaのポート。

チップ固有のヘッダーは適切ですが、ボードBSPファイルを作成した人やこれらのフレームワークの経験はありますか?私は本から始まったばかりなので、コメントは大歓迎です。


QP状態文字に言及するために+1を与えることに関するJason Sのコメントに+1。ああ、またスターと+1のトピック...それはグルーヴィーに聞こえると私は答えを楽しみにして原因:P(すみません、スパムのため、単に面白い気分で今日;))
cyphunk

回答:


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

1
ステートマシンコードのマイナーな改善:状態の変更をキューに入れ、switchステートメントの直前にのみ実際の状態を変更することで信頼性を高めることがよくあります。そうすれば、ステートをSTATE_COMPLETEに変更したと考えた直後に、ステートがSTATE_INITに変わる割り込みを心配する必要がなくなります。
AngryEE

3

私は個人的に、GPLライセンスのためにQPフレームワーク/ライブラリを使用していません。当時、私は雇用主がQPを使用してHSM(階層的ステートマシン)を試すために生地を吐き出す準備ができているとは思いませんでした。Jobyの例のように数百行のコードを必要とする1000倍のひどいステートマシンをリファクタリングするとき、QPに似た独自のものを実装しなければなりませんでした。維持するのがひどい痛みでした。私は、何か他のものを壊すことを恐れて、何か新しいものを追加しようとすることを恐れました。

コードをHSMに再設計しました。これは、システムがどのように動作するかを個人的に理解するのにはるかに役立ちました。想像以上にうまく機能しました。変更と保守がずっと簡単だったので、夢を見ることができました。システムの予期しない動作のために、ステートマシンのほとんどをやり直す必要さえありました。私が作成したフレームワークで修正するのは非常に簡単であり、QPでも同じくらい簡単だったと確信しています。私が構築したフレームワークは人気を博し、コードベース内の他の複雑なステートマシンに広がりました。

友人に、Javaを使用して量子フレームワークを実装しているロボットで、かなりうまく機能しました。これは、特定の入力に基づいたロボットの意思決定アルゴリズムの一部でした。ロボットの状態に基づいて決定しなければならないことを考えると、それは自然なフィットでした。

QPの美しさを理解しているのは、プロセッサに最適化されたステートマシンデザインのフレームワークをすぐに使用できることであり、非効率的な定型コードを出力するCASEツールに依存する必要はありません。しかし、設計を記述するステートマシンの複雑なセットを実装する場合にのみ、QPを使用します。

Jobyの例のように単純なものがあれば、彼が説明したようにそれを行ってください。しかし、ステートマシンが成長し、さまざまな条件に包まれたすべての種類の「if else」ステートメントで成長していることに気付いた場合は、QPのようなものを試してHSMに分解する時が来るかもしれません。


1

Jobyの例を拡張して非常に大きなステートマシンを実装するよりクリーンな方法は、caseステートメントを関数ポインターの配列に置き換えることです。次に、関数内の特定の状態のすべてのコードを分離できます。この方法で実装すると、必要なプログラムメモリがはるかに少ないことがわかりました。


1

caseステートメントを関数ポインターの配列に置き換えます

これがQPスタッフの仕組みです。状態の表現は、単なる関数ポインター(現在の状態の関数への)です。C ++では、メンバー関数へのポインターになりますが、基本的には同じです。現在の状態関数は、イベント、およびいくつかの疑似イベント(エントリ、終了)で呼び出されます。そのうちの1つは常に処理されず、ネストされた遷移を行うときに状態の入れ子を決定するために使用されます(QPは階層状態マシンをサポートします)。

ミロ・サメックは、すぐにArduinoをターゲットとした移植を行うと言っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.