現在商用優先度ベースのプリエンプティブRTOSを使用しているARM7上のCでプログラムされた組み込みアプリケーション(移植性要件あり)では、そのRTOSと顧客の義務ごとのRTOS依存関係を削除する必要があります。多くのHWインターフェース、スリープステートメント、I2C通信を使用する8つのタスクがあります。現状では、SWはコードを簡素化するためにRTOS機能をうまく利用していますが、タイミング要件はRTOSなしで管理できます。
現在、多くの場所で呼び出されるルーチンを含むいくつかの関数は、I2cドライバー関数への(そのスレッドの)呼び出しのブロック、スリープステートメントなどのシーケンスを実装しています。I2C呼び出し/スリープでのポーリングは顧客に受け入れられないという前提に基づいて、そのような呼び出しはその後、非ブロッキングになり、戻ります。もちろん、問題は「ステートメント」に「戻る」ことです。I2Cが完了するか、スリープ時間が経過すると、トップレベルのタスクエントリから4回コールダウンする可能性があります。
単純なスケジューラーを上にして、各タスクの階層型ステートマシンの設計に向かって収束しています。しかし、ブロック呼び出しのシーケンスを作成し、それぞれがステートマシンになり、複数の場所でさまざまな関数呼び出しの深さで呼び出されるようになったいくつかのルーチンを処理するには、タスクごとに明示的なスタック機能が必要になるようです。サブステートマシンを起動するたびに、そのプロセスに状態を割り当てて、そのタスクの「状態スタック」にプッシュできるため、そのタスクへの次のスケジューラ呼び出しですべての状態を停止できます。階層状態は、「中断」したところから処理を続行します。
この問題に適用できる他の設計アーキテクチャ、非プリエンプティブパラダイムへのコードの高速移植に関する考慮事項、または「RTOS除去」技術と設計に関する思考を豊かにするリソースと議論を指摘できますか?
3つの答えはすべて、ステートマシンベースの開発の関連性と、車輪の再発明を回避するための関連ツールの全体像を示しています。私たちの顧客は、GPLを含むいかなる種類のライセンスも取得しません。回答から、RTOSを使用せず、ポーリング呼び出しを禁止した階層型ステートマシンを使用したい場合、状態をキャッシュする方法はないようです。階層型SMは、その構造を保存することで既存のコードの移植に大いに役立ちます(ルーチンへの関数呼び出しはサブステートマシンの呼び出しになります)ので、提供されたツールを良い例として使用して、そのようにします。- ありがとう。