今回は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チカすることが確認できました。
やや駆け足で進みましたけれど、皆さまは動作確認できましたでしょうか?
コメントを書く