今回はイベントフラグを使ってみます。
投稿時の開発環境を記しておきます。
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 型で、最上位ビットが立っているとエラーです。
ここでは最下位ビットを使ってイベントの検出を行っています。
いかがでしたか?
うまく動作しましたか?
お疲れさまでした。