マイコン入門spacer ad
トップページに戻る(マイコン徹底入門:STM32で始めるARM/Cortex-M3組み込み開発)
「マイコン徹底入門」とは? |  「マイコン徹底入門」を読む |  ダウンロード |  掲示板 |  筆者の自己紹介


Previous: 3.6.4. portTICK_RATE_MS

Up: 3.6. タスクの実行頻度

Next: 3.7. Idle Hook機能


マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法: 3. タスク管理: 3.6. タスクの実行頻度:

3.6.5. vTaskDelayUntil

サンプルプログラム

freertos_vTaskDelayUntil

 タスクの待ち時間ではなく、タスクの実行周期自体を正確に指定したい場合には、vTaskDelayUntil関数を使用します。

関数名

vTaskDelayUntil関数

関数プロトタイプ

void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement )

動作

タスクの実行開始時から指定時間が経過するまでBlocked状態にして待ちます。

引数

*pxPreviousWakeTime

タスクが起動した時間。xTaskGetTickCount関数を使用して取得します。

xTimeIncrement

待ち時間を指定します。指定する数値はTick単位です。

戻り値

無し。

 *pxPreviousWakeTimeを指定するためには、xTaskGetTickCount関数を使用します。

関数名

xTaskGetTickCount関数

関数プロトタイプ

portTickType xTaskGetTickCount( void )

動作

カーネルが管理する内部時刻を返します。

引数

無し。

戻り値

無し。

 サンプルプログラムでは、以下のようにして、xTaskGetTickCount関数を使用してタスクが起動した時間を取得して変数xLastWakeTimeに格納し、これをvTaskDelayUntilに渡しています。変数xLastWakeTimeportTickType型で初期化したものを使用します。

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機能


このページはITと知的財産の法律情報「法務ネット」の管理人が制作・運営しています。