下記の記事から続くFreeRTOSの機能に関する記事です。
この記事ではFreeRTOSのタスクが保持できる「tag」の機能に関して説明します。
FreeRTOSにおける「tag」とはタスクが保持できる一つの値もしくはポインタです。使用用途としては、何らかのエラーが起きた際のタスクの情報を格納したり、別のタスクからコールバックを呼び出したりするのに使われます。
tagは値だけでなく、関数を指定することもできます。タグはタスクの管理構造体で保存されますが、使用するのはユーザのみでFreeRTOSの動作に影響しません。
また、tagの型「TaskHookFunction_t」は下記のように関数のvoidポインタとして定義されています。
typedef BaseType_t (*TaskHookFunction_t)( void * );
使用する際は、FreeRTOSConfig.hに、「configUSE_APPLICATION_TASK_TAG」を定義する必要があります。
API
void vTaskSetApplicationTaskTag(
TaskHandle_t xTask,
TaskHookFunction_t pxTagValue );
項目1 | 項目2 | 説明 |
---|---|---|
機能 | タスクにtagを設定する。tagは値でも関数ポインタでも設定可能 | |
引数 | xTask | tagを設定するタスクのID。NULLを指定した場合は呼び出し先のタスクが指定される |
pxTagValue | 設定するtagの値、もしくは関数 |
TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask );
TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask );
項目1 | 項目2 | 説明 |
---|---|---|
機能 | タスクのtagの値を取得する。tagに設定されているのが関数の場合はこのAPIは使用しないこと | |
引数 | xTask | tagを取得するタスクのID。NULLを指定した場合は呼び出し先のタスクが指定される |
返り値 | タスクのtag |
BaseType_t xTaskCallApplicationTaskHook(
TaskHandle_t xTask,
void *pvParameter );
項目1 | 項目2 | 説明 |
---|---|---|
機能 | タスクのtagに設定されている関数を呼び出す | |
引数 | xTask | 呼び出したいtagの関数を持つタスクのID。NULLを指定した場合は呼び出し先のタスクが指定される |
pvParameter | tagに設定されている関数を呼び出す際に引数として設定される | |
返り値 | tagに指定された関数がNULLでなければ0を返す |
サンプルソースコード
タスク「test_thread2」でタグを設定し、「test_thread1」でタグを取得(もしくは関数呼び出し)するサンプルを下記に示します。タスクの生成とスケジューラの開始の実装は省略しています。
static void testCallback(int * testVal)
{
*testVal = 1;
}
static void test_thread1(void * argument)
{
int testVal = 1234;
for( ;; )
{
xTaskAbortDelay( task2 );
for (int i = 0; i < 10;i++)
{
BSP_LED_On(LED1);
vTaskDelay(100);
BSP_LED_Off(LED1);
vTaskDelay(100);
}
//int tagVal = (in)xTaskGetApplicationTaskTag(task2); // tagを取得(値が設定されている場合)
xTaskCallApplicationTaskHook(task2, &testVal); // タグに設定した関数「testCallback」を呼び出し
}
BSP_LED_Off(LED1);
osThreadTerminate(NULL);
}
static void test_thread2(void * argument)
{
//int tagInitVal = 9876;
//vTaskSetApplicationTaskTag(NULL, (void*)tagInitVal); // tagに値を設定する場合
vTaskSetApplicationTaskTag(NULL, testCallback); // 関数「testCallback」をtagに設定
for( ;; )
{
BSP_LED_On(LED2);
vTaskDelay(100);
BSP_LED_Off(LED2);
}
BSP_LED_Off(LED2);
osThreadTerminate(NULL);
}