Top -> FreeRtos -> designtips3.html
ソリューション # 3
RAM 使用量の節約
<<< | >>>
ノート:このページは FreeRTOS V4.0.0 の導入以降更新されてません。
V4.0.0 は斬新なソリューションの提供であるコルーチンのコンセプトを紹介します。
タスクとコルーチンのドキュメンテーションは多くのインフォメーションを提供する。
概 要
充分な RAM とプロセサ・リソースを持っている組み込みコンピュータのクリーンなデザインを生み出す。ソリューション#3では機能を分割しタスク化する事によってRAM 使用量を減ら事を試みる。
実 装
ソリューション # 3機能タスクと優先性

       ソリューション # 3機能タスクと優先性

実 装
ソリューション # 3機能タスクと優先性

前に例題でアプリケーションのタイミング必要条件がどのように3つのカテゴリに分かれ得るか見ました:

  1. 厳密なタイミング − プラントコントロール
    前と同じように、高優先順位タスクがクリティカルなコントロール機能性に応じるために作成されます。
  2. デッドラインタイミングのみ− 人的インタフェース
    ソリューション # 3が一つの中間の優先度タスク・グループに RS232 、 キースキャンと LED 関数をまとめます。
    前述のように組み込みWeb サーバタスクは低優先度で稼働するが望ましい。 Web サーバのために特にタスクを作成するよりむしろ、アイドル・タスクフックがアイドル・タスクに Web サーバ機能を導入する。 Web サーバは決してブロックしないように書かなければならない!
  3. フレキシブルなタイミング − LED
    もし RAM が貴重であるなら、 LED 機能あまりにも単純であり、タスクである必要性は疑問です。 この例ではデモンストレーション上の理由で一つの中間の優先度タスクに LED 機能を含めます。 これは多くの方法で実装されます。(例えば周辺機器のタイマから)。
    イベントが処理を要求するまで、アイドル・タスク以外のタスクはブロック状態にある。 イベントは外部(キーが押される等)あるいは内部(タイマが期限等)です。
オペレーションのコンセプト
ソリューション # 1で示したように、機能タスクを中間の優先度付けすることは無限ループ実装に対する3つの重要な利点を持っています:
  1. 待ち行列は中間の優先度タスクはデータ準備完了イベントがあるまでブロック状態で待つことを可能にします - そして直ちにイベントを処理する適切な関数にジャンプする。 これはプロセッサ・サイクルの浪費を妨げます - ループサイクルでイベントで適切なハンドラで処理されるような無限ループ実装と比較して。
  2. リアルタイムカーネルの使用は、(アプリケーションソースコードの中で)時間クリティカルなタスクのスケジューリングの明示の必要は無い。
  3. ループからの埋め込みの Web サーバ機能の撤去は実行時間をいっそう予測可能にしました。
加えるに、シングルタスクの中にまとめられた機能の実行時間は既に同じ優先権を共有したいくつかのタスク(barr 、 LED 関数、)からとられます。 シングルあるいは多数のタスクにかかわらず、この優先度でのコードが実行する頻度は変わらない。
プラントコントロールタスクは、最高優先順位タスクとして、それが必要とする時いつでも処理時間を割り当てられる。 もし必要であるなら、それは低いあるいは中間の優先度タスクをプリエンプト(事前に制止)するでしょう。 これらのアプリケーションタスクがブロック状態になるとアイドル・タスクは実行される。 アイドル・タスクはプロセッサをパワーセーブモードへ置くオプションを持っています。
スケジューラコンフィギュレーション
評 価
2つのアプリケーションタスクを作成するだけなので、ソリューション # 2よりRAM使用量は少ない。
プロセッサ使用は必要性に応じて自動的にタスクからタスクへと切り替えられます。
効果的にアイドル状態のタスクを利用することはたった2のオーバーヘッドで3つのアプリケーションタスク優先権を作成します。
中位の優先順位内の関数の実行時間にタスク・タイミングの問題を導入すること ができた。
組み込みWeb サーバタスクの分離はこの危険を減らします、いずれにしてもそのような問題がプラントコントロールタスクに影響を与えない。
もしアイドル・タスクが電源セーブ(スリープ)モードにCPUを置くなら、消費電力は減少します、しかし、周期割り込みが不必要にCPUを目覚めさせるので、無駄かもしれないが。
RTOS 機能は処理リソースを使う。 これの大きさは選択したカーネル(時計)チック周波数に依存する。
アプリケーショ ンがあまりにも大きくなりすぎた場合、この設計法はスケーリングしない(拡張性が無い)場合があります。
結 論
これは、限られたRAMを搭載したシステムのためのよい解決策になることができますが、それでも、プロセッサを集中的に。システムの予備的容量は、将来の拡張を可能にするためにチェックする必要があります。

この例は前の例題アプリケーションの部分的な実装です。
FreeRTOS API を使います。
プラント・コントロール・タスク
プラントコントロールタスクはソリューション #2で記述とまったく同じです。
組み込み WEB サーバ・タスク
これは単純な機能で、アイドル・タスクから呼び出され、ランから終了まで実行します。
中間の優先度タスク
中間の優先どタスクは次の擬似コードによって表される。
#define DELAY_PERIOD 4
#define FLASH_RATE 1000

void MediumPriorityTask( void *pvParameters )
{
xQueueItem Data;
portTickType FlashTime;

    InitialiseQueue();
    FlashTime = xTaskGetTickCount();
    
    for( ;; )
    {
        do
        {
            // A
            if( xQueueReceive( xCommsQueue, &Data, DELAY_PERIOD ) )
            {
                ProcessRS232Characters( Data.Value );
            }
            
          // B
        } while ( uxQueueMessagesWaiting( xCommsQueue ) );
        
        // C
        if( ScanKeypad() )
        {
            UpdateLCD();
        }
        
        // D
        if( ( xTaskGetTickCount() - FlashTime ) >= FLASH_RATE )
        {
            FlashTime = xTaskGetTickCount();
            UpdateLED();
        }
    }

    // Should never get here.
    return 0;
}
上記のコード内のラベルは次を参照のこと:
  1. タスクは最初に通信イベントを待つためにブロック状態に入ります。ブロックタイムは比較的短い。
  2. データが空になるまで do-while loop を実行します。
    もしデータが空になるよりも速く待ち行列に到着するなら、この実装は修正しなければならない。
  3. 待ち行列のデータを空にしたか、あるいはデータが指定ブロック期間に到着しなかった。
    データを待つブロック状態の最大時間は、キーパッドのタイミング条件を満し走査するのに、充分短い事を保証する。
  4. LED のフラッシュ時間に到達したかをチェックする。
    この行が実行する周波数でいくらかのジッタがあるが、LED タイミング条件はこの実装によって十分フレキシブルであり満足する。

NEXT >>> ソリューション #4: プロセッサオーバーヘッドを減らすこと
Top に戻る