STM32のFreeRTOSのスレッド(タスク)の使い方

STM32のFreeRTOSでスレッド(タスク)の使い方を、サンプルコードと合わせてわかりやすく解説します。

作成するプログラム

まずはゴールを確認しておきましょう。今回はタスクを1つ用意し、そのタスクがLEDを点滅するプログラムを作成します。

このプログラム作成を通して、STM32のFreeRTOSにおけるタスクの使い方を覚えましょう。

 

タスクを使ったLED点滅プログラム

 

STM32のFreeRTOSはCMSIS RTOSのAPIを使用しており、そこではタスクのことをスレッドを呼びます。本記事でも、これ以降はタスクのことをスレッドと記述します。

 

前提条件

前提条件は目次の記事を参照してください。

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

 

プログラムの作成

スレッドの作成

まずはスレッドの作成を行いましょう。STM32CubeIDEのDevice Configuration Tool(STM32CubeMX)を開いてスレッドを作成してください。

 

  • Pinout & Configurationsタブ→Middleware→FREERTOS→Configurationタブ→Tasks and Queues
  • デフォルトのスレッドがあるのでダブルクリックして、スレッドの設定画面を開いてください
  • 下記の図にある通りに入力し、OKボタンをクリックしてください

 

スレッドの作成

 

ここの設定項目が気になる方は下記の表をご覧になってください。気にせず、とにかく動かしたい方は読み飛ばしてくださいね。

 

項目 説明
Task Name スレッド名。好きな名前を付きましょう。
Priority スレッドのプライオリティ。
Stack Size (Words) スタックサイズ。
Entry Function スレッド関数の名前。
Code Generation Option

スレッド関数の接頭語。

Defaultは何も付けない。 As externalはexternを付ける。 As weakは__weakを付ける。

Parameter タスク関数の引数に入れるパラメータの名前。
Allocation メモリの確保の仕方。Dynamicは動的に生成。Staticだと静的に生成。
Buffer Name バッファの名前。Staticを指定した時のみ使用。
Control Block Name コントロールブロックの名前。Staticを指定した時のみ使用。

 

Parameterには『&interval』と入力しました。これはLEDの点滅間隔をスレッド生成時に渡せるようにするためです。

 

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

 

点滅間隔を設定

コードの自動生成ができたら、スレッドを生成している箇所を確認してみてください。

 

main.c

/* Create the thread(s) */
/* definition and creation of Thread1 */
osThreadDef(Thread1, Thread1Func, osPriorityNormal, 0, 128);
Thread1Handle = osThreadCreate(osThread(Thread1), (void*) &interval);

 

osThreadCreate()の第2引数でintervalのポインタを渡しています。こうすることでスレッドからintervalを参照することができるようになります。

intervalは自前で作りましょう。今回は1000ms間隔としました。

 

main.c

/* USER CODE BEGIN 0 */
uint32_t interval = 1000;
/* USER CODE END 0 */

 

スレッドを実装する

後はLEDを点滅させるスレッドを実装するだけです。main.cの中に空のスレッド関数があるので探してください。

 

main.c

void Thread1Func(void const * argument)
{

  /* USER CODE BEGIN 5 */
  /* Infinite loop */
      for(;;)
      {
          osDelay(1);
      }
  /* USER CODE END 5 */ 
}

 

これを改造してLEDを点滅するようにしましょう。

 

main.c

void Thread1Func(void const * argument)
{

  /* USER CODE BEGIN 5 */
  /* Infinite loop */
      for(;;)
      {
          HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
          osDelay(*((uint32_t*)argument));
      }
  /* USER CODE END 5 */ 
}

 

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

 

まとめ

STM32のFreeRTOSを使ったスレッドの使い方は以上です。とても簡単でしたね。

APIもCMSIS RTOSに準拠しており、簡単なプログラムであればSTM32のFreeRTOSもとても使いやすいものだと思います。

 

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

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