組み込みプログラミングステートマシン


8

私は、gccを使用して32ビットMCUに重要な有限状態マシン(UML階層状態チャートとして指定)を実装することを検討しています。

うまくいくものとうまくいかないものの経験則はありますか?私の直感は、スイッチベース(または計算されたgoto)の実装はわずかにパフォーマンスが向上する必要があると述べていますが、関数ポインターベースの遷移テーブルは一般に保守性が高いと評されています。

また、組み込みアプリケーション向けにBoost MSMを評価した人はいますか?Boost MSMは一般に非常に効率的であると称賛されていますが、組み込みアプリケーションの効率はPCプログラミングの世界とは異なる方法で測定される場合があることを知っています。

MSMのコンパイルされたステートマシンエンジンがどのように見えるか知っていますか?スイッチジャンプテーブルのようなものですか、それとも関数ポインタ遷移テーブルのようなものですか?動的メモリ割り当てを使用しますか、それとも静的に使用できますか?


Boost MSM(および一般にC ++テンプレート)は、コードサイズが非常に速く膨らむため、近づかないようにします。
jms 2016年

C ++には他にも注意すべきがいくつかあります...
Matt Young

@jmsそれは、きこりが鋭利な道具に近づかないで、代わりにハンマーを使うべきだと言っているようなものです。テンプレートは鋭いツールであり、正しい方法で使用すると、特に小型のマイクロコントローラーの場合、コードの速度を上げ、サイズを小さくすることができます。間違った方法で使用すると、どのツールも間違った方法で使用される可能性があります。
Wouter van Ooijen

回答:


8

32ビットMCUで大きな違いがあるとしたら、私は驚きます。条件付きブランチを回避することで数サイクルを節約できますが、本当に数サイクルに基づいて成功または失敗しますか?RAMとROMの待機状態の数は、少なくとも同じくらい重要です。CPU命令セットも同様です。

時期尚早の最適化は、すべての悪の根源です。実装と保守が簡単なものから始め、プロファイリングに基づいて必要な場合にのみ最適化します。


アクションとは対照的に、ステートマシンフレームワークのパフォーマンスへの影響(DIYであるか、またはいくつかのライブラリーからのものか)は非常に小さいと思います。Adamが言うように:読みやすさを第一に考えたコード。秒。そして三番目。(10位のA:プロファイル。ローカル最適化はその下にあります。)
Wouter van Ooijen

3

組み込みの1つのUML実装については、QPフレームワーク-> http://www.state-machine.comをご覧ください。CとC ++の両方のバリアントが利用可能です。付属のGUI(QM)では、UML表記を使用してコーディングすることもできます。フレームワークは、Arduinoで実行するのに十分小さいです。32ビットは簡単です。

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