Top -> FreeRtos -> tasks.html
タスク
[Getting Started]
タスク状態
FreeRTOS eBook はタスクについての追加の詳細なインフォメーションとタスクの挙動を記述しています。
タスクの状態は次のどれか一つに属します:
  • Running
    タスクが実際に実行しているとき、それは実行状態にあると言います。 タスクは現在プロセッサを利用しています。
  • Ready
    Ready状態のタスクは実行することが可能(ブロック状態でも、サスペンド状態でもない)です、しかし、より以上高い優先権の別のタスクがすでに実行状態にある場合は実行状態になれません。
  • Blocked
    タスクが現在一時的あるいは外部のイベントを待っているなら、そのタスクはBlocked状態にあると言います。 例えば、もしタスクが vTaskDelay () を呼び出すなら、遅延周期が切れるまで(Blocked状態に置かれる)このタスクはブロックされる。 タスクは同じく待ち行列とセマフォイベントを待つ場合もブロックされる。 Blockedされた状態でのタスクはタイムアウト期間を指定でき、それを過ぎるとタスクはunblocked状態になる。 ブロック状態のタスクはスケジューリングされない。
  • Suspended
    Suspended状態のタスクは同じくスケジューリングされません。 タスクは明示的に vTaskSuspend ()あるいはxTaskResume ()APIが発行される場合のみ各々中断状態に入るか、出ることができる。
    「タイムアウト」周期を指定することはできません。
許されるタスク状態遷移

タスクプライオリティ
それぞれのタスクが0から(configMAX_PRIORITIES - 1)まで優先権を割り当てられます。
configMAX_PRIORITIES が FreeRTOSConfig.h の中で定義し、アプリケーションベースによってアプリケーション上に埋め込まれます。 configMAX_PRIORITIES 値が高いと、比例してFreeRTOS カーネルは多くの RAM を消費する。
小さい優先順位番号は低い優先権タスクを意味する、デフォルトのアイドルの優先度はtskIDLE_PRIORITY によってゼロと定義づけらている。
スケジューラーは ready あるいはrunning状態のタスクは常に、同様にレディ状態にあるより低い優先度のタスクよりも優先的に、プロセッサ時間を獲得できることを保証する。 言い換えれば、処理時間を与えられたタスクは常に実行可能なタスク中の最高優先順位タスクである。

タスクの実装
タスクは次の構造を持つ:
    void vATaskFunction( void *pvParameters )
    {
        for( ;; )
        {
            -- Task application code here. --
        }
    }
pdTASK_CODEはvoid関数として定義され、パラメータとして一つのvoidのポインタをとります。 全てのタスクを関数はこの型であるべきです。 パラメータはタスクの中にどんなタイプのインフォメーションでも渡すのに使うことができます − これは標準的なデモアプリケーションのいくつかのタスクによって示される。
タスク関数は絶対リターンしない無限ループとして実装されてます。多くのRTOS デモアプリケーション事例を参照してください。
タスクはxTaskCreate ()をコールすることによって作成され、vTaskDelete () によってデリートされます。

タスク作成マクロ
タスク関数はまたportTASK_FUNCTION と portTASK_FUNCTION_PROTO マクロを使って定義することができます。 これらマクロはそれぞれ関数定義とプロトタイプにコンパイラに特定の構文付加を可能にするために提供される. ドキュメンテーションで特に記述がないなら、本来使用の必要はありません。(現状PIC18 fedC ポートのみ)。
上記関数のためのプロトタイプを示す:
void vATaskFunction( void *pvParameters );         Or,
portTASK_FUNCTION_PROTO( vATaskFunction, pvParameters );
このマクロは次のコードと同等です:
    portTASK_FUNCTION( vATaskFunction, pvParameters )
    {
        for( ;; )
        {
            -- Task application code here. --
        }
    } 

アイドル・タスク
スケジューラーが始動すると、アイドル・タスクは自動的に作成されます。
アイドル・タスクは以後デリートされたタスクのRTOS によって割り当てられたメモリを解放する責任を負います。 アイドル・タスクの処理時間が欠如しない保証をすることは vTaskDelete () 機能を利用するアプリケーションにとって重要です。 アクティビティ視覚化ユーティリティーはアイドル・タスクに割り当てられたマイクロコントローラー時間をチェックすることができます。
アイドル?タスクは他にどのようなアクティブな機能も持っていませんが、他の全ての条件を満たしながら、合理的にマイクロコントローラー時間を潰します。
アプリケーションタスクがアイドル・タスクと優先権を共有することは可能です。(tskIDLE_PRIORITY).

アイドル・タスクフック
アイドル・タスクフックはアイドル・タスクのそれぞれのサイクルの間に呼び出される関数です。 もしアプリケーション機能がアイドル状態の優先順位で動くことを望むなら、2つのオプションがあります:
  1. 稼働していないタスクフックに機能を実装してください。
    少なくとも1つのタスクが常にReady状態でなくてはなりません。
    フック関数はタスクをブロックするかもしれない API 関数の呼び出しは禁止です(例えば vTaskDelay ()) 。 (コルーチンをフック関数の中でブロックすることは許されます)。
  2. 機能を実行するアイドル優先度タスクを作成してください。
    これはよりフレキシブルな解決ですが、RAM 使用法オーバーヘッドが多い。
    Embedded software application design セクションに、さらに多くのアイドルフックについてのインフォメーションがあります。
アイドルフックを作成するために:
  1. FreeRTOSConfig.h の中で configUSE_IDLE_HOOK を1にセットしてください。
  2. 次のプロトタイプを持っている関数を定義してください:
void vApplicationIdleHook(void);
アイドルフック主な用途はプロセッサを電源節約モードに入れることです。
TOPページ