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の排他制御(セマフォ、ミューテックス)

Last updated at Posted at 2024-10-17

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

FreeRTOSのセマフォとミューテックスは、他のRTOSと同様排他制御を行うために使用しされます。
あるタスクでセマフォ(orミューテックス)を獲得(ロック)している間は、他のタスクは同じセマフォを獲得(ロック)することができず、獲得しようとした場合はタスク自体がBlocked状態(休止状態)となります。

FreeRTOSのセマフォ

使用できるセマフォは以下の2種類あります。FreeRTOSのセマフォは優先度逆転が起きる場合の対処をしません。
優先度逆転が起きた際に、資源を獲得したタスクの優先度を上げる処理が欲しい場合はミューテックスを使用します。

項目 説明
バイナリセマフォ 単発の待ち合わせ用のセマフォ。Itron系と同じように使用できる。
「vSemaphoreCreateBinary()」で生成
カウンタセマフォ 複数回の資源獲得・解放を行う場合に、資源獲得回数を記憶しておくことができるセマフォ。
「xSemaphoreCreateCounting()」で生成

FreeRTOSのミューテックス

ミューテックスは優先度逆転が起きた場合の優先度引き上げ処理が行われるバイナリセマフォです。
優先度引き上げ処理を具体的に言うと、
資源の獲得中にブロックしたタスクの優先度が、資源を獲得しているタスクの優先度より高い場合、資源を獲得しているタスクの優先度をブロックしたタスクの優先度に設定します。ブロックが解除された際に、優先度は元に戻ります。
また、ミューテックスの資源獲得・解放はセマフォと同じAPI「xSemaphoreTake()」、「xSemaphoreGive()」を使用します。

API

vSemaphoreCreateBinary

void vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
項目1 項目2 説明
機能 単発の待ち合わせ用のセマフォを作成する
引数 xSemaphore セマフォID。
(SemaphoreHandle_tはポインタとして定義されているので、
セマフォIDを格納したいものを引数にする)
返り値 なし

xSemaphoreCreateCounting

SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, <br>UBaseType_t uxInitialCount )
項目1 項目2 説明
機能 資源獲得回数を数えるセマフォを作成する
引数 uxMaxCount 獲得回数の最大値
引数 uxInitialCount 獲得回数の初期値。この数値からカウントをスタートする
返り値 セマフォID。
(SemaphoreHandle_tはポインタとして定義されているので、
セマフォIDを格納したいものを引数にする)

xSemaphoreTake

BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore,
                           TickType_t xBlockTime )
項目1 項目2 説明
機能 セマフォを獲得する
引数 xSemaphore 獲得するセマフォID
xBlockTime タイムアウト時間。最大値を指定する場合はportMAX_DELAYを指定する。永続待ちはできない
返り値 正常終了したならばpdTRUEを返す

xSemaphoreGive

BaseType_t xSemaphoreGive( xSemaphore )
項目1 項目2 説明
機能 セマフォを解放する
引数 xSemaphore 解放するセマフォID
返り値 正常終了したならばpdTRUEを返す

vSemaphoreDelete

void vSemaphoreDelete( SemaphoreHandle_t xSemaphore )
項目1 項目2 説明
機能 セマフォを削除する
引数 xSemaphore 削除するセマフォID
返り値 なし

xSemaphoreCreateRecursiveMutex

SemaphoreHandle_t xSemaphoreCreateRecursiveMutex()
項目1 項目2 説明
機能 ミューテックスを作成する
返り値 ミューテックスID

サンプルソースコード

セマフォを生成し、資源獲得・解放を行うサンプルソースコードを下記に示します。


void semaphoreSampleTask()
{
    SemaphoreHandle_t semHandle;

    vSemaphoreCreateBinary(semHandle);
  //semHandle = xSemaphoreCreateCounting(5, 0); // 最大資源5のカウンタセマフォを生成する場合
  //semHandle = xSemaphoreCreateRecursiveMutex(); // ミューテックスを生成する場合

    for ( ;; )
    {
        xSemaphoreTake(semHandle, portMAX_DELAY);  // タイムアウトを最大値で設定して資源獲得
        
        /* ここに排他した状態で実行したい処理を入れる */
        
        xSemaphoreGive(semHandle); // 資源解放
    }

    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?