STM32 FreeRTOS Ver2 イベントフラグを使う

STM32 FreeRTOS Ver2 イベントフラグを使う

今回はイベントフラグを使ってみます。

投稿時の開発環境を記しておきます。

PC:Windows10 OS
IDE: STM32CubeIDE Version1.6.0
Configurator: STM32CubeMX Version6.2.1
Board: STM32Nucleo-F401RE

プロジェクトを作成する

IDEを起動し、File- New – STM32 Project を選択し、Target Selection ウィンドウが出たら Board Selector タブを選択し Boards List から NUCLEO-F401RE を選択し Next ボタンを押します。

Project 名に F401RtosV2EventFlag と入力し、Finishボタンを押します。
Initialize all peripherals with their default Mode ? と聞いてくるので Yesを押します。

RTOSを使えるように設定する

Pinout & Configuration – Categories – Middleware – FREERTOS を選択し、

Mode の Interface で CMSIS_V2 を選択します。

その下の Configuration – Tasks and Queues タブを選択し、 Addボタンを押します。

New Task のウィンドウが出てくるので、上から2つ目の Priority を osPritrityNormal に変更し OK ボタンを押します。

これで優先順位が同じ2つのスレッドが作成されることになります。

次に Eventsタブを選択し、Addボタンを押します。

New Event のウィンドウが出たら OKボタンを押します。

タイムベース ソースを変更する

Categories – System Core – SYS を選択し、SYS Mode and Configuration – Mode で

Timebase Source を Systick から TIM10 に変更しておきます。

FreeRTOSでは Systick 以外を使うことが推奨されているからです。

ビルドしてエラーがないことを確認しておきます。

main.c で以下の記述を確認しておきます。

コーディングと動作確認

2つのスレッドを以下のようにコーディングします。

/* USER CODE BEGIN 4 */
#define FLAGS_MSK1 0x00000001U
#define FLAG_ERROR 0x80000000U

void doWork();
void doWork()
{
  ;
}
/* USER CODE END 4 */

void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    HAL_Delay(5000);
    doWork();
    osEventFlagsSet(myEvent01Handle, FLAGS_MSK1);
    osDelay(1);
  }
  /* USER CODE END 5 */
}

void StartTask02(void *argument)
{
  /* USER CODE BEGIN StartTask02 */
  uint32_t retCode;
  /* Infinite loop */
  for(;;)
  {
    retCode = osEventFlagsWait(myEvent01Handle, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);
    if (retCode & FLAG_ERROR )
    {
      // エラー
    }
    else if (retCode & FLAGS_MSK1)
    {
      // イベントフラグ検出成功
      // doWork()完了後の処理をここに書く
    }
    osDelay(1);
  }
  /* USER CODE END StartTask02 */
}

ビルド後エラーがないことを確認して動作させてみます。

retCode に 1 が返ってくれば成功です。

コードの概要

2つのスレッドがあり、一つ目のスレッドのある処理が完了した後に、別のスレッドの処理を行いたい場合があります。
そんな時にイベントフラグを使います。

StartDefaultTask()のdoWork()が完了したらイベントフラグをセットして、完了を知らせます。

StartTask02()ではosEventFlagsWait()でイベントフラグを待機します。

この関数の戻り値は uint32_t 型で、最上位ビットが立っているとエラーです。

ここでは最下位ビットを使ってイベントの検出を行っています。

いかがでしたか?

うまく動作しましたか?

お疲れさまでした。

FreeRTOS_V2カテゴリの最新記事