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