Previous: 3.6.4. portTICK_RATE_MS |
Up: 3.6. タスクの実行頻度 |
Next: 3.7. Idle Hook機能 |
サンプルプログラム |
freertos_vTaskDelayUntil |
タスクの待ち時間ではなく、タスクの実行周期自体を正確に指定したい場合には、vTaskDelayUntil関数を使用します。
関数名 |
vTaskDelayUntil関数 |
|
関数プロトタイプ |
void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement ) |
|
動作 |
タスクの実行開始時から指定時間が経過するまでBlocked状態にして待ちます。 |
|
引数 |
*pxPreviousWakeTime |
タスクが起動した時間。xTaskGetTickCount関数を使用して取得します。 |
xTimeIncrement |
待ち時間を指定します。指定する数値はTick単位です。 |
|
戻り値 |
無し。 |
*pxPreviousWakeTimeを指定するためには、xTaskGetTickCount関数を使用します。
関数名 |
xTaskGetTickCount関数 |
関数プロトタイプ |
portTickType xTaskGetTickCount( void ) |
動作 |
カーネルが管理する内部時刻を返します。 |
引数 |
無し。 |
戻り値 |
無し。 |
サンプルプログラムでは、以下のようにして、xTaskGetTickCount関数を使用してタスクが起動した時間を取得して変数xLastWakeTimeに格納し、これをvTaskDelayUntilに渡しています。変数xLastWakeTimeはportTickType型で初期化したものを使用します。
void prvTaska(void *pvParameters) { ? int8_t* pcTaskName; ? pcTaskName = (int8_t *)pvParameters; ? portTickType xLastWakeTime; ? xLastWakeTime = xTaskGetTickCount(); ? while(1) ??? { ????? cprintf(pcTaskName); ????? vTaskDelayUntil(&xLastWakeTime, 5 / portTICK_RATE_MS ); ??? } } |
勘のいい方は、「xTaskGetTickCount関数はタスクの起動時刻を取得するために使用するのだからvTaskDelayUntil関数の後にないといけないのでは」と気づかれたでしょう。確かにロジックとしてはその通りなのですが、vTaskDelayUntil関数は*pxPreviousWakeTimeとしてポインタで渡された値を内部で自動的に更新する機能を持っているので、ユーザーが都度前回の終了時刻を取得する必要はありません。
このサンプルプログラムの実行結果は以下の通りであり、5ms毎にTaskaが実行されているのがわかるはずです。
abcABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC AabcBCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC ABabcCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC .... |
Previous: 3.6.4. portTICK_RATE_MS |
Up: 3.6. タスクの実行頻度 |
Next: 3.7. Idle Hook機能 |