STM32のFreeRTOSの再帰的なミューテックスの使い方

STM32のFreeRTOSで再帰的なミューテックスの使い方を、サンプルコードと合わせてわかりやすく解説します。

STM32のFreeRTOSの再帰的なミューテックス

通常のミューテックスでも説明しましたが、再帰的なミューテックスを使いたい場合は、CMSIS RTOS v1にはないAPIを使う必要があります。この記事では、この独自のAPIを使って解説します。

 

作成するプログラム

それでは今回のゴールを確認しましょう。今回は通常のミューテックスで作成したプログラムと同じものを、再帰的なミューテックスを使って作り直します。例としてはあまりよろしくありませんが、再帰的なミューテックスの使い方を理解するには十分と思います。

 

前提条件

前回の通常のミューテックスの使い方を理解していることが前提です。まだ前回の記事お読みでない方は、まずはそちらをご覧になってください。

STM32のFreeRTOSのミューテックスの使い方

 

プログラムの作成

スレッドの作成

スレッドは通常のミューテックスのサンプルと同様に、SetLEDThreadとResetLEDThreadを作成してください。

 

再帰的なミューテックスの有効化

再帰的なミューテックスを使う場合、OSの設定として有効化が必要です。

 

  • Pinout & Configurationsタブ→Middleware→FREERTOS→Configurationタブ→Config Parameters
  • USE_RECURSIVE_MUTEXESをEnabledに変更してください

 

再帰的なミューテックスの有効化

 

再帰的なミューテックスの作成

再帰的なミューテックスの有効化ができたら次は作成を行いましょう。

 

  • Pinout & Configurationsタブ→Middleware→FREERTOS→Configurationタブ→Mutexes
  • Recursive MutexesのAddボタンをクリックして、再帰的なミューテックスの設定画面を開いてください
  • 下記の図のように入力して、OKボタンを押してください

 

再帰的なミューテックスの作成

 

設定項目は通常のミューテックスと同じです。

設定が終わったらコードを自動生成してください。

 

スレッドの実装

コードを自動生成したらスレッドの中身を実装していきましょう。通常のミューテックスとほぼ同じですが、異なるAPIを使っていることに注目してください。

 

main.c:SetLEDThread

void SetLEDThreadFunc(void const * argument)
{

  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    if (osRecursiveMutexWait(LEDRecursiveMutexHandle, osWaitForever) == osOK
        && osRecursiveMutexWait(LEDRecursiveMutexHandle, osWaitForever) == osOK) {
      HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
      osDelay(1000);
      osRecursiveMutexRelease(LEDRecursiveMutexHandle);
      osRecursiveMutexRelease(LEDRecursiveMutexHandle);
      osThreadYield();
    }
  }
  /* USER CODE END 5 */ 
}

 

main.c:ResetLEDThread

void ResetLEDThreadFunc(void const * argument)
{
  /* USER CODE BEGIN ResetLEDThreadFunc */
  /* Infinite loop */
  for(;;)
  {
    if (osRecursiveMutexWait(LEDRecursiveMutexHandle, osWaitForever) == osOK
        && osRecursiveMutexWait(LEDRecursiveMutexHandle, osWaitForever) == osOK) {
      HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
      osDelay(1000);
      osRecursiveMutexRelease(LEDRecursiveMutexHandle);
      osRecursiveMutexRelease(LEDRecursiveMutexHandle);
      osThreadYield();
    }
  }
  /* USER CODE END ResetLEDThreadFunc */
}

 

再帰的なので取得とリリースを2回ずつ行うプログラムにしました。

取得はosRecursiveMutexWait()、リリースはosRecursiveMutexRelease()になっていますね。このようにCMSIS RTOS v1とは異なるAPIを使います。

 

プログラムの作成ができたら実際に動かしてLEDが点滅することを確認してみてください。

 

まとめ

STM32のFreeRTOSを使った再帰的なミューテックスの使い方は以上です。使い方は通常のミューテックスと同様ですが、CMSIS RTOS v1にはないAPIを利用する点だけ注意して使いましょう。

 

関連:STM32のFreeRTOSのミューテックスの使い方

目次:【サンプルあり】STM32のFreeRTOSの使い方まとめ

ソースコード:https://github.com/yuksblog/stm32_freertos