STM32CubeIDEでFreeRTOSを使ってみる

STM32CubeIDEでFreeRTOSを使ってみる

今回はIDEを使ってFreeRTOSの簡単な動作確認を行ってみます。

FreeRTOSと言っても、実体は Amazon FreeRTOS とは若干異なります。
CMSIS RTOSというものでFreeRTOSに皮を被せているイメージのものと考えておけば良さそうです。
STマイクロがFreeRTOSと呼んでいるので、こちらでも同じように呼ぶことにします。

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

PC:Windows10 OS
IDE: STM32CubeIDE Version1.1.0
Configurator: STM32CubeMX Version5.4.0
Board: STM32Nucleo-F401RE

こちら にたまたま STM32F401RE を使ったトレーニング資料がありましたので、これを参考に動かしてみたいと思います。
ただし、この資料は CubeMX というツールを使っているので、これを IDE に置き換えた形で動かしてみます。

資料の5ページ目に仕様が書かれています。

  • タスクとセマフォをひとづずつ作る
  • タスクはセマフォをwaitして取得できたらLEDをトグルする
  • タイマーを1秒周期で割り込み動作させてセマフォをreleaseする

これで1秒毎にLEDが点滅します。

それではさっそく始めていきましょう。
IDE で 新しく F401FreeRTOS というプロジェクトを新規に作成します。
いつものように STM32F401REボードを使いますのでボードセレクタではこちらを選択してください。
言語はデフォルト設定の C にしておきます。

プロジェクトの新規作成手順は何度か示していますので、ここでは省略します。
プロジェクトの作成方法がわからない方は こちら の記事を参考にしてみてください。

タイムベースを設定する

下の画像の通りに、Pinout & Configuration の Categories – System Core の SYS を選択します。

Timebase Source から TIM5 を選択します。

RTOS関連の設定をする

下の画像の通りに、Pinout & Configuration の Categories – Middleware の FREERTOS を選択します。
そして右側の Mode – Interface で CMSIS_V1 を選択します。

タスク

Configuration の Tasks and Queues タブを選択すると Tasks に defaultTask がありますので、これをそのまま使います。

セマフォ

Configuration – Timers and Semaphores を選択し、 Binary Semaphores の Addボタンを押し、小窓が出たら OKボタンを押します。

セマフォの名前は myBinarySem01 が自動的につけられました。

インターバルタイマーを設定する

インターバルタイマーには TIM1 を使います。

Categories – Timers で TIM1 を選択し、 Mode の Clock Source から Internal Clock を選択します。

また、Configuraiton – NVIC Settings で TIM1 update interrupt and TIM10 global interrupt の Enable をチェックして割り込みを許可します。

Parameter Settings は以下の画像の通りに設定してください。これでインターバルタイマーの値は1秒になります。

タイマーの設定に関して定数の確認をしたい方は こちら の記事を参考にしてください。

コーディングする

TIM1を動かすために main.c に以下のコードを書いてください。

/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
HAL_TIM_Base_Start_IT(&htim1);
/* USER CODE END RTOS_QUEUES */

main.c に HAL_TIM_PeriodElapsedCallback が追加されているので以下のようにコードを変更します。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM5) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
  if (htim == &htim1)
  {
    osSemaphoreRelease(myBinarySem01Handle);
  }
  /* USER CODE END Callback 1 */
}

また main.c に StartDefaultTask が追加されているので以下のようにコードを変更します。

void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    osSemaphoreWait(myBinarySem01Handle, osWaitForever);
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  }
  /* USER CODE END 5 */ 
}

資料を作成した当初とはツールの構成もかわっているしコンフィグレーターが出力するコードもだいぶ違っているようです。

動かしてみる

ビルドして動かしてみましょう。
こちらでは無事に Lチカすることが確認できました。

やや駆け足で進みましたけれど、皆さまは動作確認できましたでしょうか?

FreeRTOSカテゴリの最新記事