0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FreeRTOSのtagの使い方

Last updated at Posted at 2024-09-30

下記の記事から続く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);
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?