タスク コントロール

[API]

Modules

* vTaskDelay
* vTaskDelayUntil
* uxTaskPriorityGet
* vTaskPrioritySet
* vTaskSuspend
* vTaskResume
* xTaskResumeFromISR
* vTaskSetApplicationTag
* xTaskCallApplicationTaskHook


vTaskDelay

[Task Control]

task. h

void vTaskDelay( portTickType xTicksToDelay );

 この機能を利用可能にするため INCLUDE_vTaskDelay は1と定義しなくてはならない。 もっと多くの情報を得るためにコンフィグレーション・セクションを参照しください。

指定チック(システムクロック)数タスクを遅延する。 タスクがブロック状態にある時間はチック(システム・クロック)レートに依存します。 portTICK_RATE_MS はチックレートから実時間を計算することができます − チック(システムクロック)周期の分解能で。

vTaskDelay() ではタスクが vTaskDelay() が呼ばれた時からブロック解除するまでの相対的時間を指定します。 例えば、100チックのブロック時間を指定することは、タスクをvTaskDelay() が呼び出された後、100チック後にブロック解除する。
 結果として vTaskDelay() が周期的なタスクの周期をコントロールすることについての良い手順ではなく、他のタスクとか割り込み処理などで、vTaskDelay() が呼び出されるとそのためにタスクが次に実行する時間に影響する。
 固定周期実行を容易にするよう設計された代わりの API 関数vTaskDelayUntil () を参照してください。 呼び出しタスクがブロック解除すべき(相対時間よりも)絶対時間を指定することによって、それは成し得ます。

パラメータ:

xTicksToDelay   呼び出しタスクがブロックすべきチック(システムクロック)周期による時間量。

使用例:

void vTaskFunction( void * pvParameters )
 {
 /* Block for 500ms. */
 const portTickType xDelay = 500 / portTICK_RATE_MS;

     for( ;; )
     {
         /* Simply toggle the LED every 500ms, blocking between each toggle. */
         vToggleLED();
         vTaskDelay( xDelay );
     }
}

vTaskDelayUntil

[タスクコントロール]

task. h

void vTaskDelayUntil (portTickType * pxPreviousWakeTime 、 portTickType xTimeIncrement)

 INCLUDE_vTaskDelayUntil はこの機能を利用可能とするために1と定義されなくてはならない。
もっと多くの情報得るためにコンフィグレーション・セクションを参照してください。

指定された時刻までタスクを遅延する。 この関数は固定的な実行周期を保証する周期タスクのために使用される。

この機能は1つの重要なアスペクトで vTaskDelay () とは違います:
vTaskDelay() の指定時間はvTaskDelay() が呼び出した時、ブロック解除するまでの相対時間であるのに対して、vTaskDelayUntil () はタスクがブロック解除すべき絶対時間を指定する。

vTaskDelay() がタスクを vTaskDelay() が呼び出された時から指定されたチック数でブロックする。 したがって、vTaskDelayが次のタスクのブロック解除の時間としての固定実行周期を生成するためにvTaskDelay自体の呼び出しを使用することは困難であり、そのタスクは、次のvTaskDelay()の時間が固定されないことがあります。[コールの間に異なるパススルー、割り込み、あるいは異なる回数をプリエンプトされる事がある]。
vTaskDelay() が呼び出された時、起動するまでの相対時間を指定するのに対して、 vTaskDelayUntil() が期待する(正確な)絶対時間にブロック解除すべき時刻を指定します。

もしすでに過ぎ去った時刻を指定したならば。vTaskDelayUntil () は(ブロックしないで)すぐに戻るであろうことは注意すべきです
そのために、もし周期的な実行がどのような理由であれ止められるなら、 vTaskDelayUntil() を周期的に実行するために使っているタスクがその必要とされる起動時刻を再度計算しなければならない(例えば、タスクが一時的な中断状態の中であるとき)タスクは周期的な実行をミスさせられる。
pxPreviousWakeTime パラメータとしてリファレンスによって渡された変数を最新のチック計算と照らし合わせることによって、検出することができます。 これは大概の使用法のシナリオの下ではほとんど必要でないとしてもです。

portTICK_RATE_MS はチックレートから実時刻を計算することができます − 1つのチック周期の分解能で。

この関数は vTaskSuspendAll() のコールによって、サスペンド状態にある場合呼び出してはなりません。

パラメータ:

pxPreviousWakeTime   タスクが最後にブロック解除された時刻を保持する変数へのポインタ。 この変数はその最初の使用の前に現在時刻で初期化しなくてはなりません(下の例参照)。 この後、変数は vTaskDelayUntil() の中で自動的に最新のものにされます。

xTimeIncrement   サイクルタイム周期。
タスクは時刻(* pxPreviousWakeTime + xTimeIncrement)にブロック解除されます。 同じ xTimeIncrement パラメータ値で持って vTaskDelayUntil を呼び出すことは固定したインタバル周期でタスクを実行させる。

使用例:

 // Perform an action every 10 ticks.
 void vTaskFunction( void * pvParameters )
 {
 portTickType xLastWakeTime;
 const portTickType xFrequency = 10;

     // Initialise the xLastWakeTime variable with the current time.
     xLastWakeTime = xTaskGetTickCount();

     for( ;; )
     {
         // Wait for the next cycle.
         vTaskDelayUntil( &xLastWakeTime, xFrequency );

         // Perform action here.
     }
 }
   

uxTaskPriorityGet

[Task Control]

task. h

unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );

INCLUDE_vTaskPriorityGet はこの機能を利用可能とするのために1と定義されなくてはなりません。 もっと多くの情報を得るためにコンフィグレーション・セクションを参照してください。

タスクの優先度を取得する。

パラメータ:
pxTask   問い合わすべきタスクのハンドル。
NULLハンドルを渡すことは呼び出したタスクの優先度が返されるという結果を生む。

リターン:
pxTask の優先度。

使用例:

 void vAFunction( void ) 
{ 
xTaskHandle xHandle;

    // Create a task, storing the handle. 
    xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

    // ...

    // Use the handle to obtain the priority of the created task. 
    // It was created with tskIDLE_PRIORITY, but may have changed 
    // it itself. 
    if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY ) { 
        // The task has changed it's priority. 
    }

    // ...

    // Is our priority higher than the created task? 
    if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) ) { 
        // Our priority (obtained using NULL handle) is higher. 
    } 
} 

vTaskPrioritySet

[Task Control]

task. h

void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority );

INCLUDE_vTaskPrioritySet はこの機能を利用可能であるのために1と定義されなくてはなりません。 もっと多くの情報のためにコンフィギュレーション・セクションを参照してください。

タスクの優先度を設定する。
もし設定している優先度が現在実行しているタスクより高いなら。
関数からが戻る前に、コンテキストスイッチが起ります

パラメータ: pxTask   優先度を設定するタスクのハンドル
空のハンドルを渡すと呼び出しタスクの優先度が設定されるという結果になります。

uxNewPriority   タスクに設定する優先度。

使用例:

 void vAFunction( void ) 
 { 
 xTaskHandle xHandle;

     // Create a task, storing the handle. 
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // ...

     // Use the handle to raise the priority of the created task. 
     vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );

     // ...

     // Use a NULL handle to raise our priority to the same value. 
     vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 ); 
 }

TaskSuspend

[Task Control]

task. h

void vTaskSuspend( xTaskHandle pxTaskToSuspend );

INCLUDE_vTaskSuspend はこの機能を利用可能にするために1と定義されなくてはなりません。 もっと多くの情報のためにコンフィグレーション・セクションを参照してください。

タスクを一時停止する。

停止状態にあるタスクは、その優先度に関わらず、決してマイクロコントローラーの実行時間を得ない。

vTaskSuspend へのコールは累積しません− すなわち同じタスクを2度vTaskSuspend() を呼び出しても実行可能状態への移行はvTaskResume() への1回のコールのみで戻る。

パラメータ:
pxTaskToSuspend   サスペンド(停止)するタスクのハンドル。 NULLハンドルを渡すことは呼び出しタスクをサスペンド状態にする。

例使用例:

void vAFunction( void ) 
 { 
 xTaskHandle xHandle;

     // Create a task, storing the handle. 
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // ...

     // Use the handle to suspend the created task. 
     vTaskSuspend( xHandle );

     // ...

     // The created task will not run during this period, unless 
     // another task calls vTaskResume( xHandle ).

     //...

     // Suspend ourselves. 
     vTaskSuspend( NULL );

     // We cannot get here unless another task calls vTaskResume 
     // with our handle as the parameter. 
 }   

vTaskResume

[Task Control]

task. h

void vTaskResume( xTaskHandle pxTaskToResume );

INCLUDE_vTaskSuspend はこの機能を利用可能とするために1と定義されなくてはなりません。 もっと多くの情報のためにコンフィグレーション・セクションを参照してください。

サスペンド状態のタスクを再開します。

1つあるいは複数のvTaskSuspend()コールによってサスペンドさせられたタスクが vTaskResume() の1回のコールよって再実行可能となる。

パラメータ:

pxTaskToResume   準備するタスクのハンドル。

使用例:

 void vAFunction( void ) 
{ 
xTaskHandle xHandle;

    // Create a task, storing the handle. 
    xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

    // ...

    // Use the handle to suspend the created task. 
    vTaskSuspend( xHandle );

    // ...

    // The created task will not run during this period, unless 
    // another task calls vTaskResume( xHandle ).

    //...

    // Resume the suspended task ourselves. 
    vTaskResume( xHandle );

    // The created task will once again get microcontroller processing 
    // time in accordance with it priority within the system. 
}

xTaskResumeFromISR

[Task Control]

task. h

portBASE_TYPE xTaskResumeFromISR( xTaskHandle pxTaskToResume );

INCLUDE_vTaskSuspend と INCLUDE_xTaskResumeFromISR はこの機能を利用可能にするために1と定義されなくてはなりません。 もっと多くの情報のためにコンフィグレーション・セクションを参照してください。

ISR の中から呼び出し可能なサスペンド中のタスクを再開する関数。

1つあるいは複数の vTaskSuspend()コールによってサスペンド状態のタスクを1回のxTaskResumeFromISR() コールよって再び実行可能状態にする。

もしタスクがサスペンド状態に入る前に割り込みが到着する可能性があるなら,xTaskResumeFromISR() をタスクを割り込みに同期させるために使うべきではありません−割り込みミスに導くことになる。
 このような万一の事態を避けるため、同期機構としてセマフォを使用使用すべきです。

パラメータ: pxTaskToResume   リジュームすべきタスクのハンドル。

リターン:
pdTRUE コンテキストスイッチをしてタスクを再開した。
pdFALSE それ以外。 これは ISR によってコンテキストスイッチが ISR の後に必要としたか否かを知るために使われます。

使用例:

 xTaskHandle xHandle;

 void vAFunction( void )
 {
     // Create a task, storing the handle.
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // ... Rest of code.
 }

 void vTaskCode( void *pvParameters )
 {
     // The task being suspended and resumed.
     for( ;; )
     {
         // ... Perform some function here.

         // The task suspends itself.
         vTaskSuspend( NULL );

         // The task is now suspended, so will not reach here until the ISR resumes it.
     }
 }


 void vAnExampleISR( void )
 {
 portBASE_TYPE xYieldRequired;

     // Resume the suspended task.
     xYieldRequired = xTaskResumeFromISR( xHandle );

     if( xYieldRequired == pdTRUE )
     {
         // We should switch context so the ISR returns to a different task.
         // NOTE:  How this is done depends on the port you are using.  Check
         // the documentation and examples for your port.
         portYIELD_FROM_ISR();
     }
 }