STM32のFreeRTOSでスレッド(タスク)の使い方を、サンプルコードと合わせてわかりやすく解説します。
作成するプログラム
まずはゴールを確認しておきましょう。今回はタスクを1つ用意し、そのタスクがLEDを点滅するプログラムを作成します。
このプログラム作成を通して、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もとても使いやすいものだと思います。