組み込み・制御機器開発分野に於いて、最も厄介なのが、CPU変更によるアーキテクチャの変化だ。
開発者はプロジェクトの度にデータシートと睨めっこに、都度アルゴリズムを変更するのは、時間の無駄以外の何物でも無い。
ここでは、あらゆるアーキテクチャ上で動作する、汎用的な設計思想を一例として示す。
■前提条件
・あらゆる機能追加に対して他機能へ影響を与えず、また機能追加が容易に行われなければならない。
・H/W依存は下記3点に集約され、これら全てをファイル差し替えのみで達成せねばならない。
①タイマー制御 ②設定系レジスタ ③制御系レジスタ(入力・出力)
・メインルーチンはシンプルな構成であるべき
・ジャンプテーブルによる状態遷移制御を用い、状態間の依存関係を無くす
しかし、状態間のデータはある程度柔軟に受け渡し出来るべき
・グローバル変数は極力使用してはならない
上記全てを満たす為の、ミニマムメインルーチンは以下の流れとなる。
■状態遷移思想
独立した処理形態を持たせることを目的を最優先で考えた設計とするが、機能追加にも柔軟に対応する為、状態遷移の思想を用いる。あらゆる機能・アルゴリズムは状態遷移で管理され、メインルーチンから呼び出される。
メインルーチンはセンサ情報の取得→状態遷移先の取得→状態遷移先の処理→
タイマ関連処理(S/W割り込みと定義)の順で処理はループする。
主状態1つに対して複数の副状態から構成され、
副状態1つに対して複数の個別状態から構成される。
主状態1つ全てを満たすと1機能達成となる。
主状態間のデータ共有は保障せず、副状態間のデータ共有はメインルーチンにて保障する。
体重測定を実施し、結果を音声通知するシステムの状態遷移例を以下に示す。
体重計測と一言に言っても、必要な処理は多岐に渡る。
これら各種役割を各種状態で管理する事により、常にメインルーチンから
副状態コールされる、シンプルな仕組みが構築される。
これにより、機能追加をしたい場合、副状態を追加する事で無限に機能追加が可能となる。
加え、他状態への依存は100%無くなる。
■状態間のデータ保持について
状態遷移は細かい処理毎にメインルーチンへ処理を戻す。
故に為都度スコープを外れてしまい、値の保持が不可能となる。
ともすれば、状態毎に値を保持する仕組みを提供しなければならない。
副状態毎に値の保持が必要な情報を構造体へ集約、それら全てを
メインルーチンにて共用体定義を行う。
副状態間で共有すべきデータは、副状態毎に共有する情報を
ローカル構造体として定め、副状態構造体先頭へ配置する。
本情報は各種副状態がデータ管理の責任を持つこととし、
初回副状態遷移時はデータの内容は保障しない。
故に各副状態の初回遷移で内部初期化を行うこと。
また、共有関係のある副状態間では、データ送信元が
共有構造体の内容を保障すること。共有構造体以外の情報は保障しないこととする。
■状態遷移管理方法
主状態・副状態の定義を以下に示す。個別状態は副状態内部で個別に定義・処理される。
これらテーブルを定義し、各種状態からの遷移情報を保持しておけば、
個々の処理は依存関係から独立しながらも、処理間の繋がりを保つ事が出来る。
■状態遷移関数規約
状態遷移・副状態の統一インターフェースを示す。副状態は必ず本インターフェースに準拠しなければならない。
状態遷移先を統一I/Fとして定義する事で、あらゆる処理で依存関係を排除出来る。
これで、メインルーチンからの外部状態遷移思想は完成する。
疲れたのでここで一旦おしまい。
続きは教務室にて。