STM32のFreeRTOSで再帰的なミューテックスの使い方を、サンプルコードと合わせてわかりやすく解説します。
STM32のFreeRTOSの再帰的なミューテックス
通常のミューテックスでも説明しましたが、再帰的なミューテックスを使いたい場合は、CMSIS RTOS v1にはないAPIを使う必要があります。この記事では、この独自のAPIを使って解説します。
作成するプログラム
それでは今回のゴールを確認しましょう。今回は通常のミューテックスで作成したプログラムと同じものを、再帰的なミューテックスを使って作り直します。例としてはあまりよろしくありませんが、再帰的なミューテックスの使い方を理解するには十分と思います。
前提条件
前回の通常のミューテックスの使い方を理解していることが前提です。まだ前回の記事お読みでない方は、まずはそちらをご覧になってください。
プログラムの作成
スレッドの作成
スレッドは通常のミューテックスのサンプルと同様に、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を利用する点だけ注意して使いましょう。