| Top -> FreeRtos -> designtips3.html | ||||||||||||||
| ソリューション # 3 RAM 使用量の節約 |
||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| <<< | >>> | ||||||||||||||
| ノート:このページは FreeRTOS V4.0.0 の導入以降更新されてません。 V4.0.0 は斬新なソリューションの提供であるコルーチンのコンセプトを紹介します。 タスクとコルーチンのドキュメンテーションは多くのインフォメーションを提供する。 |
||||||||||||||
| 概 要 | ||||||||||||||
| 充分な RAM とプロセサ・リソースを持っている組み込みコンピュータのクリーンなデザインを生み出す。ソリューション#3では機能を分割しタスク化する事によってRAM 使用量を減ら事を試みる。 | ||||||||||||||
| 実 装 | ||||||||||||||
| ソリューション # 3機能タスクと優先性 | ||||||||||||||
![]() ソリューション # 3機能タスクと優先性 |
||||||||||||||
| 実 装 | ||||||||||||||
| ソリューション # 3機能タスクと優先性 前に例題でアプリケーションのタイミング必要条件がどのように3つのカテゴリに分かれ得るか見ました:
|
||||||||||||||
| オペレーションのコンセプト | ||||||||||||||
ソリューション # 1で示したように、機能タスクを中間の優先度付けすることは無限ループ実装に対する3つの重要な利点を持っています:
プラントコントロールタスクは、最高優先順位タスクとして、それが必要とする時いつでも処理時間を割り当てられる。 もし必要であるなら、それは低いあるいは中間の優先度タスクをプリエンプト(事前に制止)するでしょう。 これらのアプリケーションタスクがブロック状態になるとアイドル・タスクは実行される。 アイドル・タスクはプロセッサをパワーセーブモードへ置くオプションを持っています。 |
||||||||||||||
| スケジューラコンフィギュレーション | ||||||||||||||
| 評 価 | ||||||||||||||
|
||||||||||||||
| 結 論 | ||||||||||||||
| これは、限られた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;
} |
||||||||||||||
上記のコード内のラベルは次を参照のこと:
|
||||||||||||||
|
|
||||||||||||||
| NEXT >>> ソリューション #4: プロセッサオーバーヘッドを減らすこと | ||||||||||||||
| Top に戻る | ||||||||||||||