6

現在商用優先度ベースのプリエンプティブRTOSを使用しているARM7上のCでプログラムされた組み込みアプリケーション(移植性要件あり)では、そのRTOSと顧客の義務ごとのRTOS依存関係を削除する必要があります。多くのHWインターフェース、スリープステートメント、I2C通信を使用する8つのタスクがあります。現状では、SWはコードを簡素化するためにRTOS機能をうまく利用していますが、タイミング要件はRTOSなしで管理できます。

現在、多くの場所で呼び出されるルーチンを含むいくつかの関数は、I2cドライバー関数への(そのスレッドの)呼び出しのブロック、スリープステートメントなどのシーケンスを実装しています。I2C呼び出し/スリープでのポーリングは顧客に受け入れられないという前提に基づいて、そのような呼び出しはその後、非ブロッキングになり、戻ります。もちろん、問題は「ステートメント」に「戻る」ことです。I2Cが完了するか、スリープ時間が経過すると、トップレベルのタスクエントリから4回コールダウンする可能性があります。

単純なスケジューラーを上にして、各タスクの階層型ステートマシンの設計に向かって収束しています。しかし、ブロック呼び出しのシーケンスを作成し、それぞれがステートマシンになり、複数の場所でさまざまな関数呼び出しの深さで呼び出されるようになったいくつかのルーチンを処理するには、タスクごとに明示的なスタック機能が必要になるようです。サブステートマシンを起動するたびに、そのプロセスに状態を割り当てて、そのタスクの「状態スタック」にプッシュできるため、そのタスクへの次のスケジューラ呼び出しですべての状態を停止できます。階層状態は、「中断」したところから処理を続行します。

この問題に適用できる他の設計アーキテクチャ、非プリエンプティブパラダイムへのコードの高速移植に関する考慮事項、または「RTOS除去」技術と設計に関する思考を豊かにするリソースと議論を指摘できますか?


3つの答えはすべて、ステートマシンベースの開発の関連性と、車輪の再発明を回避するための関連ツールの全体像を示しています。私たちの顧客は、GPLを含むいかなる種類のライセンスも取得しません。回答から、RTOSを使用せず、ポーリング呼び出しを禁止した階層型ステートマシンを使用したい場合、状態をキャッシュする方法はないようです。階層型SMは、その構造を保存することで既存のコードの移植に大いに役立ちます(ルーチンへの関数呼び出しはサブステートマシンの呼び出しになります)ので、提供されたツールを良い例として使用して、そのようにします。- ありがとう。

4

4 に答える 4

5

Adam Dunkels の Protothreadsはチェックしましたか? 彼はそれらを「軽量でスタックレスな C のスレッド」と呼んでいます。

車輪を再発明するのではなく、protothreads サイトからインラインで直接引用します。

Protothreads は、小規模な組み込みシステムやワイヤレス センサー ネットワーク ノードなど、メモリの制約が厳しいシステム向けに設計された、非常に軽量なスタックレス スレッドです。Protothreads は、C で実装されたイベント ドリブン システムの線形コード実行を提供します。Protothreads は、基になるオペレーティング システムの有無にかかわらず使用して、ブロッキング イベント ハンドラーを提供できます。プロトスレッドは、複雑なステート マシンや完全なマルチスレッドを使用せずに、制御のシーケンシャル フローを提供します。

私は Protothreads と Samek の QP HSM を使用しました。どちらも重複するドメインの問題に対する優れたソリューションです。このために、私はおそらくプロトスレッドに傾倒します。

商用RTOSを排除するとおっしゃいました。それがコードスペース、コスト、エンジニアの学習曲線、パフォーマンスのせいなのか疑問に思っています.RTOSを(多くの)無料のものの1つに置き換えることはできますか? そうではないと思いますが、聞いても問題ありません。

PS Dunkels には、組み込み開発者向けの有用なリソースとソフトウェアが多数掲載されたすばらしい Web サイトもあります。チェックしてみてください (Contiki、プロトコル スタックなど)。

于 2009-07-09T03:48:12.500 に答える
4

IAR visualStateなどのツールを使用すると、個別のスタックなしで階層ステート マシンのコードを生成できます。少し効率が悪く、機能が少なく、きれいなUML StateChart画像をサポートしていない無料のSMCがあります。

コード ステート マシンを、状態を保持するための switch ステートメントと静的変数を含む関数として渡すこともできます。

C マクロを使用してこれを行う軽量のステート マシン ベースの疑似スレッド ライブラリがあります。プロトスレッドをチェックする

于 2009-07-08T14:50:46.457 に答える
3

MiroSamekの量子プログラミングフレームワークを確認することを強くお勧めします。彼は、ARM7などの多くのプラットフォームで実行される最も効率的なHSMの1つを持っています。彼はまた、あなたのニーズに合うようにフレームワークのさまざまなレベルの複雑さを持っています。C /C++のPracticalStateChartsという彼の本も入手することをお勧めします。彼はCとC++の両方で階層ステートマシンを持っています。このフレームワークの利点は、UMLまたは状態図から実際のコードにある程度の効率で移行するのが難しくないことです。このフレームワークは、独自のスケジューラとして実行することも、RTOSと一緒に使用することもできます。

私は実際に、自社で開発したRTOSの1つにC ++で独自のHSMを実装し、ある程度の成功を収めました。私はSamekの設計原則をたくさん使用しましたが、GPL(無料版)と商用ライセンス(非GPL)の価格設定のため、彼のコードは使用しませんでした。

于 2009-07-08T20:53:53.127 に答える