Previous: 3.1.7. main関数の終端の処理 |
Up: 3. タスク管理 |
Next: 3.3. タスクにパラメータを渡す(文字列) |
サンプルプログラム |
freertos_pvParameters_int |
FreeRTOSでは、タスクの登録時に、タスクを登録する側から、登録されるタスクに、一定のパラメータを渡すことができます。xTaskCreate関数の第4引数であるpvParametersに、渡したい値を格納した変数のポインタを指定します。void型のポインタですので、実際に渡される値は、どのような型でも構いません。
このサンプルプログラムの動作は前項のものと同じですが、タスクが表示する文字をタスク用関数の中では指定せず、xTaskCreate関数から渡しています。渡すパラメータはポインタで渡しますので、予め変数として登録しておきましょう。
int8_t TaskA_symbol = ‘A’; int8_t TaskB_symbol = ‘B’; |
xTaskCreate関数では、第4引数で、渡すパラメータのアドレスを指定します。
xTaskCreate(prvTaskA, (signed portCHAR *)"TaskA", 192, &TaskA_symbol, 1, NULL); xTaskCreate(prvTaskB, (signed portCHAR *)"TaskB", 192, &TaskB_symbol, 1, NULL); |
xTaskCreate関数の第4引数はタスク用関数の引数として参照渡しされます。void型のポインタなので、実際に利用する前に、利用したい型のポインタとしてキャストします。ここではポインタ自体ではなく値を利用したいので、仮引数をint8_t型のポインタにキャストした後その中身を参照しています。
void prvTaskA(void *pvParameters) { ? int8_t pcTaskName; ? pcTaskName = *(int8_t *)pvParameters; |
結果、前項と同じように、AとBが繰り返し表示されます。
BBBBBBBBBBBBAAAAAAAAAAAABBBBBBBBBBBAAAAAAAAAAAABBBBBBBBB BBAAAAAAAAAAAABBBBBBBBBBBBAAAAAAAAAAABBBBBBBBBBBBAAAAAAA AAAABBBBBBBBBBBBAAAAAAAAAAABBBBBBBBBBBBAAAAAAAAAAABBBBBB ... |
ちなみに前項のサンプルプログラムのタスク用関数の冒頭部分もパラメータを受け取るための命令です。パラメータを使わないのに処理を記載していたのは、関数中で使用しない引数があると、GCCが警告を出すためです。警告が出てもコンパイル自体は正常に行えますので、警告が気にならないのであれば、実際にはこれらの行を記載しなくても構いません。筆者は警告が常に出ている状態になってしまうと、本当に気をつけないといけない警告が出たときに見逃してしまうので、不要な警告は表示させないよう処理しています。
void prvTaskA(void *pvParameters) { ? int8_t *pcTaskName; ? pcTaskName = (int8_t *) pvParameters; |
Previous: 3.1.7. main関数の終端の処理 |
Up: 3. タスク管理 |
Next: 3.3. タスクにパラメータを渡す(文字列) |