2009-07-08 4 views
6

現在、商業優先順位ベースのプリエンプティブなRTOSを使用しているARM7のC言語でプログラミングされた組み込みアプリケーションでは、RTOSおよびRTOSの依存関係を顧客ごとに削除する必要があります。多くのHWインターフェイス、スリープステートメント、I2C通信を使用して8つのタスクがあります。つまり、タイミング要件はRTOSなしで管理可能ですが、SWはコードの簡素化のためにRTOS機能を有効に使います。RTOS除去エクササイズの明示的なスタックに代わるものはありますか?

多くの場所で呼び出されるルーチンを含むいくつかの関数は、現在、I2Cドライバ関数、スリープステートメントなどの呼び出しをブロックする(そのスレッドに対して)一連の呼び出しを実装します。 I2C呼び出し/スリープのポーリングは受け入れられません。そのような呼び出しは、ブロックされずに戻ります。問題は、I2Cが完了するかスリープ時間が経過したときに、おそらくトップレベルのタスク入力から4つのコールを「ステートメント」に「戻す」ことです。

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

問題に適用可能な他のデザインアーキテクチャ、非プリエンプティブパラダイムへのコードの高速移植に関する考慮事項、または思考豊かなリソースや「RTOS除去」のテクニックやデザインについての議論を参照できますか?


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

答えて

4

IARvisualStateのようなツールを使用すると、別々のスタックを持たない階層型ステートマシン用のコードを生成できます。少し効率が悪く、機能が少なく、かなりのUML StateChartピクチャをサポートしていない無料のSMCがあります。

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

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

3

Miro SamekのQuantum programming frameworkを見ることを強くお勧めします。彼はARM7のような多くのプラットフォーム上で動作する最も効率的なHSMを持っています。彼はまた、あなたのニーズに合うようにフレームワークの複雑さの様々なレベルを持っています。私はPractical StateCharts in C/C++と呼ばれる彼の本をつかむことをお勧めします。彼はCとC++の両方で階層的な状態マシンを持っています。このフレームワークの美しさは、UMLや状態図からある程度効率的な実際のコードに移行するのが難しくないことです。このフレームワークは、独自のスケジューラとして実行することも、RTOSに沿って使用することもできます。

私は実際に自社の自家製HSMをC++で実装しています。私は多くのSamekの設計原則を使用しましたが、GPL(無料版)と商用ライセンス(非GPL)の価格設定のためにコードを使用していませんでした。

5

Adam Dunkels' Protothreadsをチェックしましたか?彼はホイール

「Cで軽量、スタックレススレッド」それらを呼び出すのではなく再発明、Iはインラインここで直接protothreadsサイトからTADを引用します:

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

私はProtothreads & SamekのQPのHSMを使用しました - 彼らは、ドメインの重複での問題のために良い解決策の両方をしています。このため私はたぶんprotothreadsに傾くだろう。

あなたは、商用RTOSを削除すると述べました。それがコードスペース、コスト、エンジニアの学習曲線、性能などの理由によるものかどうかは分かります... RTOSを(多くの)無料のものに置き換えることができますか?私は思っていませんが、尋ねることを傷つけることはありません。

P.S. Dunkelsには、組み込み開発者のためのuseful resources & softwareがたくさんある偉大なウェブサイトもあります(Contiki、プロトコルスタックなど)

1

私は量子プログラミングフレームワークにも行く予定です!

関連する問題