C の switch ステートメントを使用して、組み込みシステム用の単純なステート マシンを実装しました。ルックアップ テーブルで関数ポインターを使用した方がよいことはわかっていますが、それは次のステップとして取っておきます。
私のステート マシンには次の状態があります。
- 起動(初期状態)
- 起動エラー。
- アイドル (システムはこの状態での入力のみをチェックします。表示などは更新しません。単に「アイドル」です)。
- チェック(これが実際のアプリケーションです)
- プログラム
- 内部メモリにコピー
システムが起動すると、ポートを構成し、ディスプレイを初期化し、SPI バスに接続された IC とハンドシェイクして、すべてが A-OK であることを確認する起動状態に入ります。その場合、システムはアイドル状態に入ります。そうでない場合は、スタートアップ エラー状態に入り、LCD にエラーを表示し、変数にフラグを立ててから、アイドル状態に入ります。
アイドル状態では、プログラムはマイクロコントローラーの 3 つのピンをポーリングして、3 つのボタン (チェック、プログラム、メモリにコピー) のいずれかが押されているかどうかを確認します。押されたボタンに応じて、適切な状態になり、コードを実行し、LCD を更新してから、アイドル状態に戻ります。注: システムにハードウェア障害があった場合、システムはボタンが押されても気にしません。Startup Error 状態は、hardware_fault と呼ばれる変数にフラグを立てます。これが設定されている場合、Idle 状態が入力ボタンのポーリングに煩わされないようにします。
ステート マシンを実装するのはこれが初めてで、これが適切な設計かどうか確信が持てませんでした。Idle 状態で入力をポーリングする FSM の例を実際に見たことがありません。代わりに、ほとんどの例は本質的にかなり連続しているようです (たとえば、カウンターのように)。それで、私の質問は、私のデザインは合理的ですか? それは機能しますが、ここにいる誰もが知っているように、悪いデザインと良いデザインがあります。