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のeventGroup

Last updated at Posted at 2024-10-23

下記の記事から続くFreeRTOSの機能に関する記事です。

FreeRTOSのeventGroupについて説明します。

eventGroupとは

名前はeventGroupですが、仕様はItronやToppers等のイベントフラグと似たような形です。イベントフラグの使用可能なビット数はFreeRTOSConfig.hで定義するconfigUSE_16_BIT_TICKSの値によって決まります。
configUSE_16_BIT_TICKSが0なら8、configUSE_16_BIT_TICKSが1なら24まで使用することができます。

タスクの切り替え時の振る舞い

スケジューラの具体的な動きとしては、タスク情報の構造体に待っているビットの値を格納してブロック状態となり、タスクの切り替えを行います。仕様書ではフラグ待ち時はブロックステートとなっていますが、タスクをサスペンドさせた時と同じようにpxDelayedTaskListに追加されるようです。

イベントフラグのセット時は、タスク情報の構造体に保持していたビットの値を参照し、待っていたビットならばステートをreadyステートに変更し、タスクの切り替えを行います。

API

xEventGroupCreate

EventGroupHandle_t xEventGroupCreate( void )
項目1 項目2 説明
機能 イベントフラグを作成する
引数 なし
返り値 作成に成功したイベントフラグのID。失敗時はNULLが入る

xEventGroupWaitBits

EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
                                 const EventBits_t uxBitsToWaitFor,
                                 const BaseType_t xClearOnExit,
                                 const BaseType_t xWaitForAllBits,
                                 const TickType_t xTicksToWait )
項目1 項目2 説明
機能 イベントフラグを待つ
引数 xEventGroup イベントフラグID
uxBitsToWaitFor 待ちbitパターン
xClearOnExit イベントフラグが立った際に、
フラグをクリアするかどうか
xWaitForAllBits pdTRUEならば、待っている
すべてのbitが立つまで待つ。
pdFALSEなら、待っている
bitのうちどれかが立つのを待つ
xTicksToWait タイムアウト時間。タイムアウトを無しに設定する場合は、FreeRTOSConfig.hにて「INCLUDE_vTaskSuspend」を1に定義し、xTicksToWaitはportMAX_DELAYを指定する。
返り値 待ち解除時のbitパターン

xEventGroupSetBits

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
                                const EventBits_t uxBitsToSet )
項目1 項目2 説明
機能 イベントフラグを立てる
引数 xEventGroup イベントフラグID
uxBitsToSet セットするbitパターン
返り値 uxBitsToSet をセットした後のbitパターン

xEventGroupSetBitsISR

EventBits_t xEventGroupSetBitsISR( EventGroupHandle_t xEventGroup,
                                   const EventBits_t uxBitsToSet,
                                   BaseType_t *pxHigherPriorityTaskWoken  )
項目1 項目2 説明
機能 イベントフラグを立てる
引数 xEventGroup イベントフラグID
uxBitsToSet セットするbitパターン
pxHigherPriorityTaskWoken イベントフラグを立てた際にready
ステートになるタスクが、その時
点でrunningステートのタスクよりも優先度が高い場合にpdTRUEが入る
返り値 uxBitsToSet をセットした後のbit
パターン

xEventGroupClearBits

EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,
                                  const EventBits_t uxBitsToClear )
項目1 項目2 説明
機能 イベントフラグをクリアする
引数 xEventGroup イベントフラグID
uxBitsToClear クリアするbitパターン。
0になっているbitをクリアする
返り値 uxBitsToClear
でクリアする前のbitパターン

vEventGroupDelete

void vEventGroupDelete( EventGroupHandle_t xEventGroup )
項目1 項目2 説明
機能 イベントフラグを削除する
引数 xEventGroup 削除するイベントフラグのID
返り値 なし

サンプルソースコード

eventGroupのサンプルソースコードを下記に示します。
下記のサンプルでは、eventGroupを待つタスクとeventGroupをセットするタスクを生成して動作させています。


#define EVENT_PATTERN (0x0001)

TaskHandle_t eventGroupSetTaskHandle;
TaskHandle_t eventGroupWaitTaskHandle;
EventGroupHandle_t eventGroup;


static void eventGroupSetTask(void * argument)
{
	uxArraySize = uxTaskGetNumberOfTasks();

	for( ;; )
	{
		vTaskDelay(100);
		/* イベント(0x001)をセット */
        xEventGroupSetBits(eventGroup, EVENT_PATTERN);
	}
 
    vTaskDelete(NULL); /* 何らかのエラーで処理が終了した場合にはタスクを削除 */
}

static void eventGroupWaitTask(void * argument)
{
	EventBits_t uxBitsToWaitFor = EVENT_PATTERN;

	for( ;; )
	{
        /* イベント待ち */
		xEventGroupWaitBits(eventGroup, uxBitsToWaitFor, pdTRUE, pdFALSE, 1000000);

        /* ここにセットされたビットと対応する処理を行う */
        if (uxBitsToWaitFor & EVENT_PATTERN)
        {
        
        }
	}
 
    vTaskDelete(NULL); /* 何らかのエラーで処理が終了した場合にはタスクを削除 */
}

/* タスクとeventGroupを生成するタスク */
static void StartTask(void const * argument)
{
    eventGroup = xEventGroupCreate();

    if (pdTRUE != xTaskCreate(eventGroupSetTask, "eventGroupSetTask", 1024, NULL, 2, &eventGroupSetTaskHandle))
    {
        return;
    }

    if (pdTRUE != xTaskCreate(eventGroupWaitTask, "eventGroupWaitTask", 1024, NULL, 4, &eventGroupWaitTaskHandle))
    {
        return;
    }

    vTaskDelete(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?