Azure RTOS習得(6):低電力動作

STM32G4評価ボードのAzure RTOS低電力動作サンプルコード:Tx_LowPowerは、現在正常に動作しません。原因は、Stop1モード開始/Run復帰処理であることは判りました(下表の青部分)。

そこで、この低電力モード開始/復帰処理を、VCPメッセージ出力へ変更、低電力動作は保留し、Azure RTOS低電力動作プロジェクト作成方法と低電力動作の流れを説明します。

処理名 処理内容:低電力動作

(LD2:評価ボード単体)

優先度 プリエンプション閾値
メインスレッド 1) セマフォ取得を永遠に待つ
2) 取得時LD1 500ms点滅を10回実施
10 10
S1プッシュ割込み セマフォカウンタ=0時、セマフォ放出
Enter_LowPower_Mode Stop1モード開始処理 ➡ VCPメッセージ出力
Exit_LowPower_Mode Runモード復帰処理 ➡ VCPメッセージ出力

まとめ

STM32G4評価ボードのAzure RTOS低電力動作サンプルコード:Tx_LowPowerは、Stop1モード開始/Run復帰に問題があり正常動作しません。

そこで、Stop1モード開始/復帰処理を保留にし、Azure RTOS低電力動作プロジェクト作成方法と低電力動作の流れを説明しました。

Azure RTOSプロジェクトで低電力動作させるには、STM32CubeMXのConfiguration ThreadXタブLow PowerのEnter LowPower SupportとTX_LOW_POWER_TICKNESSをEnableにするだけです。

Enable後、CubeMX生成のApp_ThreadX_LowPower_Enter/Exitの中身:Enter/Exit_LowPower_Modeへ、STM32G4低電力動作7モードの設定/Run復帰処理を記述すれば、Azure RTOS低電力動作ができます。

Tx_LowPower動作

サンプルコード:Tx_LowPower の正常な動作が下記です。

1) S1プッシュでLD1が10回点滅後、Enter_LowPower_Mode実行しStop1停止
2) S1プッシュ割込処理でExit_LowPower_Mode実行しRun復帰

つまり、S1プッシュ毎にLD1が10回点滅し、その後、低電力Stop1モードで待機します。Stop1状態表示はありません。

Stop1モード動作の代わりにVCPメッセージ出力が下記です。S1プッシュでLD1が10回点滅、点滅中はVCPメッセージ出力無しです。違いは、Stop1モード動作有無です。

Stop1モード動作の代わりのVCP出力
Stop1モード動作の代わりのVCP出力

「非」動作対策の保留(NOP)

STM32CubeMXは、プログラムフレームワーク生成に優れています。Enter/Exit_LowPower_Mode内容のみを変更すれば、Stop1以外のStop2モードやSleepモードへの低電力動作変更が簡単にできます。

ちなみに、筆者は、Sleepモードへも挑戦しましたが、正常動作はしませんでした。
※Enter/Exit_LowPower_Mode正常化をご教授頂ける方は、メールを頂けると助かります。

そこで、このEnter/Exit_LowPower_Mode処理は、一旦、保留(NOP)とします。

Tx_LowPowerが正常化した後、改めて保留にしたEnter/Exit_LowPower_Mode処理を入れ替えれば済むからです。現状は、NOPの代わりにVCPメッセージ出力処理を選びました。

この保留対策で、Azure RTOS低電力動作プロジェクト作成方法と低電力動作の流れ理解の段階へ進めます。

Azure RTOS低電力動作プロジェクト作成方法

Azure RTOS Low Powerプロジェクト作成
Azure RTOS Low Powerプロジェクト作成

低電力動作有りと無しのプロジェクト作成差は、CubeMXのConfiguration ThreadXタブのLow Powerを開き、Enter LowPower SupportとTX_LOW_POWER_TICKNESSをEnableにするだけです。

App_ThreadX_LowPower_EnterとApp_ThreadX_LowPower_Exitは、CubeMXが生成する関数名です。この両関数の中身が、我々が開発するEnter/Exit_LowPower_Mode関数です。

つまり、Enter/Exit_LowPower_Mode中身を変えれば、その他の部分はそのままで、様々な低電力動作、例えばSleepやStop2へ対応できる作りになっています。フレームワーク生成に優れるSTM32CubeMXの利点です。

低電力動作の流れ

全てのスレッドが、待機状態になると、App_ThreadX_LowPower_Enterとその中身Enter_LowPower_Modeが実行されます。その結果、例えば、Sleepが低電力動作の場合には、MCUコアSleep+周辺回路動作になります。

割込み発生でApp_TreadX_LowPowerとその中身Exit_LowPower_Modeが実行されRun復帰、最優先スレッドが実行されます。

この低電力動作に関して、公式Azure RTOSサイトに記述は有りません。低電力動作は、個別MCU依存のためでしょう。

STM32G4低電力動作モード

STM32G4の7つの主要低電力モード(出典:STM32G4 - PWR)
STM32G4の7つの主要低電力モード(出典:STM32G4 – PWR)

そこで、STM32G4の低電力動作をまとめました。元資料は、STM32G4 – PWRLPTIMです。

STM32G4は、7種の低電力動作モードをサポートしています。Runウエイクアップ時間が11サイクルと短く、電力低減効果も高いSleepが筆者のお勧めです。

サンプルコードのEnter/Exit_LowPower_Mode処理が複雑なのは、更に効果の高いStop1だからです。

サンプルコード対応

・サンプルコードが無い時は、他の評価ボードから流用。
・サンプルコードに問題ありの時は、当該処理をNOP化、サンプルが示す内容取得。

サンプルコードは、開発TipsやKnow Howの宝庫です。しかし、残念ながら付属説明は、最低限です。説明するとキリが無いからです。そこで、弊社は、ベアメタル開発経験がある方を対象に、少し丁寧に説明を追加したつもりです。

サンプルコードと評価ボードさえあれば、実際にMCU動作が確認ができ、1から10まで記載の分厚いユーザマニュアルを読むよりも、手軽で効率的にMCU開発ができます。

サンプルコードにも、トラブルがあります。STM32G4評価ボード:NUCLEO-G474REを使ったAzure RTOS習得(2)~(5)用のサンプルコード対応をまとめたのが、本章最初の2行です。また、(2)~(5)で使ったサンプルコード名と内容が下表です。

サンプルコード名 サンプル内容(詳細リンク先参照) 備考
AzureRtos0 汎用Azure RTOSプロジェクト作成 NUCLEO-G474RE+Arduinoプロトタイプシールド動作
AzureRtosEventFlag スレッド間イベントフラグ同期 STM32G4サンプル流用動作
AzureRtosQueue スレッド間キューメッセージ送受信 NUCLEO-G0B1RE流用動作
AzureRtosMutexSema ミューティックス/バイナリセマフォ排他制御 STM32G0C1E-EV流用動作
AzureRtosLowPower 低電力動作プロジェクト作成(本稿) STM32G4サンプル非動作

最近のMCU開発は、HAL(Hardware Abstruction Layer)API利用のため、サンプルコード流用が簡単です。個別MCUハードウェアに依存しないためです。

便利なサンプルコードを活用すれば、効率的なMCU開発ができます。更に、複数サンプルコードを流用し、プロトタイプの早期開発が容易な弊社MCUテンプレートを使えば、開発効率は上がります。

STM32G4評価ボードとArduinoプロトタイプシールド、LCDやADC動作のBaseboardを使ったST版Azure RTOSテンプレート(仮名)は、年内開発予定です。NXP版FreeRTOSテンプレートは、コチラで販売中です。

評価ボードへArduinoプロトタイプシールドを追加しスレッド毎にLED点滅中
評価ボードへArduinoプロトタイプシールドを追加しスレッド毎にLED点滅中

Azure RTOSやFreeRTOSは、IoT MCU開発に必要です。ベアメタルLチカ理解に相当するRTOS機能コンポーネントの習得、個人レベルで初めてはいかがでしょう。

Azure RTOS習得(5):Mutexとセマフォ

Azure RTOSミューテックスとバイナリセマフォを使ったプロジェクトを作成し、スレッド間の排他制御方法を説明します。Azure RTOSでは、ミューテックスとバイナリセマフォが、同じ機能であることも判ります。

先にまとめ、次に詳細の順で説明します。

ミューテックスとバイナリセマフォは同じ動作結果
ミューテックスとバイナリセマフォは同じ動作結果

まとめ

Azure RTOS排他制御には、ミューテックスやリソースアクセス数1のバリナリセマフォが使われます。

STM32G4評価ボードにミューテックスとバリナリセマフォサンプルコードが無いため、STM32G0C1E-EVのTx_Thread_Syncサンプルコードを流用し、AzureRtosMutexSemaプロジェクトを作成しました。

作成したAzureRtosMutexSema プロジェクトを使い、Azure RTOS排他制御を、STM32G4評価ボードにArduinoプロトタイプシールドを追加し、ミューテックスは、バイナリセマフォと同じ動作結果をもたらすことを示しました。

リソースアクセス数2以上のカウントセマフォは、排他制御だけでなくイベント通知にも使えますが、優先度逆転など注意事項もあります。

本稿説明のAzure RTOS APIは、下記です。

・ミューテックス/セマフォ取得:tx_mutex / semaphore_getと、TX_NO_WAIT
・ミューテックス/セマフォ開放:tx_mutex / semaphore_put
・スレッド処理中断:tx_thread_sleepと、コンテキストスイッチ
・セマフォ優先度の逆転、ミューテックス優先度の継承と、TX_INHERIT / TX_NO_INHERIT

単純なAzure RTOS排他制御は、ミューテックス利用が良さそうです。

STM32G4 Azure RTOSサンプルコード探し

STM32G4(Cortex-M4/170MHz)評価ボード:NUCLEO-G474REへのAzure RTOSサンプルコードは、現在3個、この中にミューテックスやセマフォを使うサンプルコードはありません。

対策は、キューサンプルコードの前稿と同じです。CubeIDEのInformation Centerℹ️でImport STM32CubeMX exampleをクリックし、Example SelectorタブでThreadXにチェックを入れて流用できるサンプルコードを選定します。

選定したSTM32G0C1E-EVのTx_Thread_Suncコードを、STM32G4へ流用します。

STM32G4 Azure RTOSミューテックスとバイナリセマフォサンプルコードの探し方
STM32G4 Azure RTOSミューテックスとバイナリセマフォサンプルコードの探し方

Tx_Thread_Syncプロジェクト

ミューテックスやセマフォは、スレッド間の排他制御に用います。しかし、サンプルプロジェクト名は、“Sync”:同期となっていて違和感があります。

サンプルプロジェクトのreadme.htmlを読むとミューテックスとバリナリセマフォを使っていますので、ミューテックスとバイナリセマフォの排他制御利用例であることは、間違いありません。

サンプルの2つのスレッドは、それぞれLED点灯の独立した制御です。プロジェクトが示したいのは、LED点灯の直列制御、この直列化のため、ミューテックス、または、バイナリセマフォを同期手段として用いたからと筆者は、解釈しました。

つまり、手段のミューテックスやバイナリセマフォよりも、制御結果からプロジェクト名を付けたのだと思います。

面白いのは、このTx_Thread_Syncは、1プロジェクト内で、ミューテックスとバイナリセマフォをマクロで切替え、両者が同じ結果をもたらすことを示している点です(最初のVCP出力参照)。

しかしながら弊社は、Azure RTOSの排他制御手段でのプロジェクト名や日本語コメントを付けます。

AzureRtosMutexSemaプロジェクト

下表が、Tx_Thread_Syncの処理内容です。STM32G4評価ボード:NUCLEO-G474REとArduinoプロトタイプシールド用に、赤の工夫を加えました。

スレッド名 処理内容:スレッド1/2のLED点灯排他制御

(LD2:評価ボード単体+
Arduinoプロトタイプシールド

優先度 プリエンプション閾値
スレッド1 1) 排他オブジェクト取得確認
2) 成功時LED1 500ms/5秒トグル後、オブジェクト開放
3) 失敗時排他オブジェクト取得待ち
10 10
スレッド2 1) 排他オブジェクト取得確認
2) 成功時LED2 500ms /5秒トグル後、オブジェクト開放
3) 失敗時排他オブジェクト取得待ち
10 10

排他オブジェクトは、マクロでTX_MUTEX定義済みならミューテックス、未定義ならバイナリセマフォ利用に変更できます。

AzureRtosMutexSemaプロジェクト作成

AzureRtosMutexSemaプロジェクト作成方法も、AzureRtosEventFlagの時と同じです。

汎用テンプレートAzureRtos0をコピー&別名AzureRtosMutexSemaでペーストし、AzureRtosMutexSemaプロジェクトを作成します。ペースト先のAzureRtos0.icoは、AzureRtosMutexSema.icoへRenameします。

これで、AzureRtosMutexSemaプロジェクトのひな型ができました。

STM32G0C1E-EV のTx_Thread_Syncコードapp_threadx.c/hを流用し、AzureRtosQueueプロジェクトの、app_threadx.cとapp_threadx.h へ追記します。追記コードの一部抜粋が下記です。

app_threadx.c追記例

app_threadx.c追記ソースコード抜粋
app_threadx.c追記ソースコード抜粋

app_threadx.h追記例

app_threadx.h追記ソースコード抜粋
app_threadx.h追記ソースコード抜粋

Azure RTOSミューテックスとバイナリセマフォ

サンプルコードは、ミューテックスがデフォルト利用ですので、Azure RTOSミューテックスで説明します。

スレッド1/2は、優先度、プリエンプション閾値ともに同じです。

しかし、スレッド1を先に生成し即実行(TX_AUTO_START)しますので、常にスレッド1が排他オブジェクト:ミューテックスを先に取得(tx_mutex_get)し、LED1トグル点灯を5秒間続けます。5秒経過後、ミューテックスを開放(tx_mutex_put)し、1ティックの10msスリープ(tx_thread_sleep)します。この処理を繰返します。

スレッド2は、開始後オブジェクト:ミューテックス取得を狙いますが、スレッド1取得済みのため待ち無し(TX_NO_WAIT)で取得狙いを繰返します。スレッド1のミューテックス解放で、ミューテックスを取得し、LED2トグル点灯を5秒間続けます。5秒経過後、ミューテックスを開放し、10msスリープするのは、スレッド1と同じです。

ミューテックスオブジェクトにより、スレッド1/2が排他動作します。

ここで、ミューテックス解放後の1ティックスリープは重要です。このスリープが、スレッド1/2のコンテキストスイッチを行います。試しにスリープをコメントアウトすると、排他制御が働きません。

app_thread.x.h L60のマクロUSE_TX_MUTEXをコメントアウトすると、バイナリセマフォ(tx_semaphore_get/tx_semaphore_put)を使ってミューテックスと同じ動作結果が確認できます。

Azure RTOSサイトのカウントセマフォを読むと、カウントセマフォは、排他制御だけでなくイベント通知にも使用可能です(前稿キュー イベント チェーンがその利用例)。また、デットロックやスレッド優先度の落とし穴、“優先度の逆転”(Priority Inversion)などの利用時注意事項もあります。

排他制御だけなら、ミューテックス利用がシンプルで良さそうです。但し、“優先度の逆転”対策の“優先度の継承”(Priority Inheritance)オプション:TX_INHERITが必要です。サンプルコードは、TX_NO_INHERITです。

※優先度の逆転、優先度の継承を試すには、スレッド1/2以外の第3のスレッドが必要です。第3スレッドは、スレッド1/2の中間の優先度と、1/2排他制御とは無関係なことも必要です。この逆転、継承もRTOSらしい機能ですが、サンプルコード実装は無く、各自でお試しください、ということでしょう。

ミューテックス/バイナリセマフォ排他制御の結果、ArduinoプロトタイプシールドのLED1とLED2が、交互に点滅を繰返すことが確認できます。

オリジナルプロジェクト名:“Sync”が示すようにLED1/2は同期して交互点滅している、と記述することも可能です。

RTOS文章直列記述→並列動作マッピング

本サンプルコードは、わずか2個スレッドです。それでも、RTOS処理を文章で記述する難しさを感じます。文章は、動作を「直列」で記述することが得意だからです。

RTOS処理は、複数のスレッドが「並列」に動作します。勿論、シングルコアで時分割動作なので、実際に動作しているのは、RTOSを含め1個です。ですが、これを判り易く文章化するのは、結構難しいことです。

例えば、本稿スレッド1/2のtx_thread_sleepです。開発者同士なら、ソースコードを見せれば、それで事足ります。しかし、そもそもRTOS理解レベルが不明の顧客へ、スリープの目的や意味を説明しても、判ってもらえるでしょうか?

RTOS開発は、開発アプリの顧客向け資料作成でも苦労しそうです😭。

RTOS習得には、公式サイト文章記述の各種RTOS機能を、サンプルコードへ変換後、さらに、個々の開発者が、サンプルコードと評価ボードを使って「納得するまで色々変えてみること」が必要だと思います。

この試行で、直列記述の文章で表現されたRTOS動作が、開発者の中でRTOS並列動作へマッピングされます。RTOS習得・開発には、並列動作マッピングの過程が最重要だと思います。

Azure RTOS習得(4):メッセージキュー

Azure RTOSのキューを使ったプロジェクトを作成し、スレッド間のメッセージ送受信方法を説明します。メッセージキューは、比較的判り易い機能です。先にまとめ、次に詳細の順に説明します。

まとめ

Azure RTOSメッセージキュー送受信
Azure RTOSメッセージキュー送受信

Azure RTOSのスレッド間メッセージ送受信には、キューが用いられます。

STM32G4評価ボードのAzure RTOSメッセージキューサンプルコードが無いため、NUCLEO-G0B1REのTx_Thread_MsgQueueサンプルコードを流用し、AzureRtosQueueプロジェクトを作成しました。

作成したAzureRtosQueueプロジェクトを使い、基本的なAzure RTOSメッセージキュー機能を、STM32G4評価ボードにArduinoプロトタイプシールドを追加し説明、動作確認しました。

本稿説明のAzure RTOS APIは、下記です。

・メッセージキュー作成:tx_queue_create
・メッセージキュー送信:tx_queue_send
・メッセージキュー受信:tx_queue_receiveと、TX_NO_WAIT / TX_WAIT_FOREVER
・メッセージキュー送信時通知:tx_queue_send_notifyと、キュー イベント チェーン

複数のQメッセージを受信スレッドで処理し、かつ、メッセージ無しの時、受信処理を中断する場合は、Azure RTOSキュー イベント チェーン(Queue Event chaining)機能が効果的です。

STM32G4 Azure RTOSサンプルコード探し

現在、STM32G4(Cortex-M4/170MHz)評価ボード:NUCLEO-G474REへのAzure RTOSサンプルコードは、3個、この中にキューサンプルコードはありません。

そこで、逆にExample Selectorから流用できるキューサンプルコード:Tx_Thread_MsgQueueを探します。選定条件は、利用中のCubeIDE版数(v1.9.0)、評価ボード(Nucle-64)に近いものが良いでしょう。

CubeIDEのInformation Centerℹ️でImport STM32CubeMX exampleをクリックし、Example SelectorタブでThreadXにチェックを入れて選定します。

選定したNUCLEO-G0B1REのTx_Thread_MsgQueueコードを、STM32G4へ流用します。

STM32G4 Azure RTOSキューサンプルコードの探し方
STM32G4 Azure RTOSキューサンプルコードの探し方

AzureRtosQueueプロジェクト

下表が、Tx_Thread_MsgQueueの処理内容です。STM32G4評価ボード:NUCLEO-G474REとArduinoプロトタイプシールド用に、赤の工夫を加えました。評価ボード+Arduinoプロトタイプシールドの目的は、Azure RTOS習得(2)を参照してください。

スレッド名 処理内容:Q1/Q2によるメッセージ送受信

(LD2:評価ボード単体+
Arduinoプロトタイプシールド

優先度 プリエンプション閾値
送信スレッド1 500ms毎にSET_GRN_LEDメッセージをQ1へ送信
Q送信失敗時、LD2点灯+停止
5 5
送信スレッド2 1s毎にRESET_GRN_LEDメッセージをQ2へ送信
Q送信失敗時、LD2点灯+停止
5 5
受信スレッド Q1とQ2、両方からメッセージ受信
Q1受信成功時、LED1トグル点灯+VCP出力
Q2受信成功時、LED2トグル点灯+VCP出力
受信失敗時、LD2点灯+停止
10 10

AzureRtosQueueプロジェクト作成

AzureRtosQueueプロジェクト作成方法は、前稿のAzureRtosEventFlagと同じです。汎用テンプレートAzureRtos0をコピー&別名AzureRtosQueueでペーストし、AzureRtosQueueプロジェクトを作成します。ペースト先のAzureRtos0.icoも、AzureRtosQueue.icoへRenameします。

これで、AzureRtosQueueプロジェクトのひな型ができました。

NUCLEO-G0B1REのTx_Thread_MsgQueueコードapp_threadx.c/hを流用し、AzureRtosQueueプロジェクトの、app_threadx.cとapp_threadx.h へ追記します。追記コードの一部抜粋が下記です。

app_threadx.c追記例

app_threadx.c追記ソースコード抜粋(橙色は注意箇所)
app_threadx.c追記ソースコード抜粋(橙色は注意箇所)

app_threadx.h追記例

app_threadx.h追記ソースコード抜粋
app_threadx.h追記ソースコード抜粋

Azure RTOSメッセージキュー

Azure RTOSのスレッド間メッセージ送受信には、メッセージキューが用いられます。

送信スレッド1/2のtx_queue_sendで、Q1/2へメッセージ送信、受信スレッドのtx_queue_receiveで、Q1/2からメッセージ受信、メッセージ内容を確認し、受信成功ならLED1/2をトグル点灯させます。

送信スレッド1/2は、同じ優先度とプリエンプション閾値です。送信間隔が同じ500msだと煩雑ですので、スレッド2は、1秒送信間隔へ変更しました。

Azure RTOSメッセージキューの送受信は、比較的判り易い機能です。メッセージキューを作り(tx_queue_create)、そのQへの送受、STのKnowledge Baseに判り易いアニメもあります。

しかしながら、受信スレッドが、複数Qからのメッセージ処理を行い、かつ、メッセージ無しの時に無限待ち(TX_WAIT_FOREVER)の場合には、キュー イベント チェーン(Event chaining)が効果的です。

本サンプルは、複数Qからの受信処理を行いますが、待ち無し(TX_NO_WAIT)の例です。

AzureRtosQueueプロジェクトVCP出力
AzureRtosQueueプロジェクトVCP出力

キュー イベント チェーン

Azure RTOS ThreadX 機能第 3 章の中程に、“キュー イベント チェーン”の説明があります。簡単に抜粋すると、

本受信スレッドのようにQ1とQ2の両方からメッセージを受信し、メッセージ無しの時、受信中断もある場合は、Q1/Q2に通知関数を登録(tx_queue_send_notify)し、カウントセマフォを使うキュー イベント チェーンが有効。キュー イベント チェーンなしでの実現は“非常に困難”。

流用サンプルコードのreadme.htmlにもキーワード:Event chainingがあります。しかし、このキュー イベント チェーンは未実装です。

カウントセマフォなしでは非常に困難でRTOSらしい機能ですが、各自でお試しください、ということでしょう😢。本ブログもこの方針に従いました。

Azure RTOS習得(3):新規Azure RTOSプロジェクト

Azure RTOS習得3回目は、新規STM32CubeIDE Azure RTOSプロジェクト作成方法と、STM32CubeMX生成ソースコードの、どこに、何を、追加すれば良いかを説明します。

新規「汎用」Azure RTOSプロジェクト

前稿で、STM32G4(Cortex-M4/170MHz)評価ボード:NUCLEO-G474REへArduinoプロトタイプシールドを追加し、最も基本的なAzure RTOS ThreadXサンプルコードのTx_Thread_Creation動作を解説しました。

このTx_Thread_CreationサンプルコードのTx_Thread_Creation .icoから、新規の「汎用」AzureRtos0プロジェクトを作成します。

汎用の意味は、このAzureRtos0プロジェクトへセマフォやキューなどのRTOS機能を追加し、Azure RTOS習得に使うからです。

残念ながら現時点では、STM32G4用Azure RTOSセマフォやキューのサンプルコードは無いため、これらRTOS単独機能を持つプロジェクトを自作する訳です。

AzureRtos0プロジェクトから自作予定のAzure RTOS機能プロジェクトが以下です。

・AzureRtosEventFlagプロジェクト(本稿)
・AzureRtosQueueプロジェクト
・AzureRtosMutexプロジェクト
・AzureRtosSemaphoreプロジェクト

Tx_Thread_Creation .ico

STM32CubeIDE(以下CubeIDE)の新規STM32プロジェクトは、様々な作成方法があります。

ただ、Azure RTOSプロジェクトは、STM32CubeMX(以下CubeMX)の設定に、ベアメタル開発と異なる注意が必要です。このような時は、既に設定済みのCubeMX Configuration File (.ico)を流用すると、注意事項を含んだ新規プロジェクト作成が簡単にできます。

Azure RTOSプロジェクトのCubeMX設定の注意事項は、別途投稿します。本稿は新規Azure RTOSプロジェクト作成に焦点を置き説明します。

新規汎用AzureRtos0プロジェクト作成

Tx_Thread_Creation .icoを流用したAzureRtos0プロジェクト作成手順が下記です。

① CubeIDEのInformation Centerℹ️でStart new project from STM32CubeMX file(.ioc)クリック
② STM32CubeMX ico fileにTx_Thread_CreationのTx_Thread_Creation .ico選択、Project NameにAzureRtos0を入力しFinishクリック

Tx_Thread_Creation.ico流用の新規プロジェクト作成
Tx_Thread_Creation.ico流用の新規プロジェクト作成

③ PA5ユーザラベルをLD2へ変更、PC4とPC5をGPIO Output、ユーザラベルLED1、LED2に設定、PC7をGPIO Input、ユーザラベルS1に設定(LD2は評価ボード、LED1/2、S1は追加Arduinoプロトタイプシールドのポート)

ユーザラベル変更とArduinoプロトタイプシールドポートLED1/2とS1追加
ユーザラベル変更とArduinoプロトタイプシールドポートLED1/2とS1追加

④ Project>Generate Codeをクリックし、初期設定コードとAzure RTOSプロジェクトファイル生成
⑤ main.c L92へ、下記タイトルVCPメッセージ出力HALコード追記

VCPメッセージ出力HALコード追記
VCPメッセージ出力HALコード追記

⑥ ビルドし、評価ボードへダウンロード
⑦ Tera Termなどのターミナルソフトで追記VCPメッセージを確認し、新規汎用AzureRtos0プロジェクト動作確認

新規汎用AzureRtos0プロジェクト動作確認
新規汎用AzureRtos0プロジェクト動作確認

Azure RTOSイベントフラグ機能追加

AzureRtos0プロジェクトへ、イベントフラグを使ってメインスレッドとスレッド1/2間同期を行う機能を追加し、AzureRtosEventFlagプロジェクトを作成します。

このプロジェクトは、Azure RTOS ThreadXサンプルコードと同じ処理内容です。従って、Azure RTOS ThreadXサンプルコードが、AzureRtos0へ追記するコードの代用に使えます。

始めに、AzureRtos0プロジェクトファイルの、どこに、何を追加するかを説明し、次章で実例を示します。

追記ファイル 追加内容
Core>Src>
app_threadx.c
1) UINT App_ThreadX_Init()へ、イベントフラグ生成関数、追加スレッド生成関数
2) 追加スレッドのエントリ関数(メイン関数)
Core>Inc>
app_threadx.h
追加スレッド優先度、プリエンプション閾値などのマクロ

RTOSであっても、ベアメタル開発で機能追加する時と同じ追記ファイルと追加内容です。

違いは、App_ThreadX_Init()の中でイベントフラグや追加スレッドを生成すると、直にRTOS動作を開始(TX_AUTO_START)する点です。従って、ベアメタル関連main.c/hの変更点は、VCP出力メッセージの変更程度です。

つまり、RTOS関連とベアメタル関連、それぞれのメインエントリー(メイン関数)があり、RTOS動作追加だけなら、main.c/hは不変でも構いません。

筆者は、cファイルとhファイルを一緒に記述したい派です。しかし、CubeMXがこれらを分離してRTOS関連ファイルを生成しますので、このファイル分離に従い追記します。

スレッド優先度やプリエンプション閾値を変えれば、Azure RTOS動作が簡単に変わりますので、分離の方が好ましいのかもしれません(動作変更例は、Azure RTOS習得(2)の4章:メインスレッド参照)。

AzureRtosEventFlagプロジェクト作成

AzureRtos0プロジェクトはテンプレートとして様々なプロジェクトで利用しますので、CubeIDEでAzureRtos0プロジェクトをコピーし、別名のAzureRtosEventFlagプロジェクトとしてペーストして使います。ペースト先のAzureRtos0.icoも、AzureRtosEventFlag.icoへRenameします。

これで、AzureRtosEventFlagプロジェクトのひな型ができました。

AzureRtosEventFlagプロジェクトの追記部分抜粋が下記です。追記コードは、Azure RTOS ThreadXサンプルコードです。

CubeMX生成コメントの、/* USER CODE BEGIN … */、/* USER CODE END …*/が、追記ガイドに役立ちます。

※手抜きご希望の方は、Azure RTOS ThreadXサンプルのapp_threadx.cとapp_threadx.hを、そのままAzureRtosEventFlagのapp_threadx.cとapp_threadx.hへ上書きしてもOKです😅。但し、LED1/2への出力は変更してください。

AzureRtosEventFlagプロジェクトへ追記後、ビルドし評価ボードへダウンロードします。

App_threadx.c追加例

app_threadx.c追記ソースコード抜粋
app_threadx.c追記ソースコード抜粋(下線は要変更)

app_threadx.h追加例

app_threadx.h追記ソースコード抜粋
app_threadx.h追記ソースコード抜粋

AzureRtosEventFlagプロジェクト動作確認

AzureRtosEventFlagプロジェクトは、スレッド1がArduinoプロトタイプシールドのLED1制御、スレッド2がLED2制御を行う以外は、Azure RTOS ThreadXサンプルコードと同じ動作です。

従って、同じ動作を確認しAzureRtosEventFlagプロジェクト作成の成功です。

作成したAzureRtosEventFlagプロジェクトを使って、イベントフラグの制御、スレッド1/2優先度やプリエンプション閾値変更によるArduino LED 1/2動作変化を確認し、イベントフラグ機能を習得してください。

本稿で作成したAzure RTOSイベントフラグの機能は、前稿で説明済みですので、割愛します。

まとめ

Azure RTOS ThreadXサンプルコードのTx_Thread_Creation.icoを流用した、新規汎用AzureRtos0プロジェクト作成方法を示しました。

汎用AzureRtos0プロジェクトに、RTOS機能別プロジェクト例として、イベントフラグ機能を追加したAzureRtosEventFlagプロジェクトを作成し、Azure RTOS ThreadXサンプルコードと同じ動作を、評価ボードにArduinoプロトタイプシールド追加し確認しました。

機能追加したAzureRtosEventFlagプロジェクトにより、汎用AzureRtos0プロジェクトソースコードのどこに、何を追記するかを示しました。

今後、AzureRtos0プロジェクトへセマフォなどの機能を追加し、Azure RTOS機能別習得をすすめます。

付記:日本語文字化け対策

デフォルトのSTM32CubeIDEとSTM32CubeMXを使ってプロジェクト開発時、日本語文字化けが発生します。過去投稿済みの対策を付記します。

STM32CubeMXのプロジェクトGenetate Code実行「前」に、
STM32CubeIDEの設定変更
① Windows>Windows>Prefernces>Colors & font>文字セットを「日本語」へ設定
② Project>Properties>Text file encordhingをOthers:「Shift-JIS」へ設定

以上で、Genetate Codeしソースコードが上書きされても、日本語文字化けは無くなります。

Azure RTOS習得(2):Azure RTOS ThreadXサンプルコード

Azure RTOS習得2回目は、STM32G4 Azure RTOS ThreadXサンプルコードを解説します(コチラの投稿3章でAzure RTOS開発ツール動作確認に使ったコード)。

STM32G4 Azure RTOS ThreadXサンプルコードは、スレッド優先度とプリエンプション閾値を、スレッド実行時に変更する例と、スレッド間同期にイベントフラグを用いる例を示しています。

STM32G4 Azure RTOS ThreadXサンプルコードの3スレッド

注意)サンプルコードのプリエンプション閾値とREADME記述が異なります。正しくは下記です。

スレッド名 処理内容

(LD2:評価ボード単体)

優先度 プリエンプション閾値
メインスレッド スレッド1/2優先度と閾値変更→LD2点灯シナリオ制御 5 5
スレッド1 LD2を5秒間500msで点滅 10 10
スレッド2 LD2を5秒間200msで点滅 10 9

評価ボード:NUCLEO-G474REは、ユーザLED:LD2を1個実装しています。1個のLD2を2個のスレッド1/2で制御するため、点滅間隔を変えることでどちらのスレッド制御かを示します。また、メインスレッドとスレッド1/2間の同期に、Azure RTOSイベントフラグを用います。

この評価ボードに、2個LED1/2、1個SWを実装したArduinoプロトタイプシールドを追加し、各スレッド処理を、下記のように工夫しました。

スレッド名 処理内容

(LD2:評価ボード+

LED1/LED2/S1:Arduinoプロトタイプシールド

優先度 プリエンプション閾値
メインスレッド スレッド1/2優先度と閾値変更→LD2点灯シナリオ制御 5 5
スレッド1 LED1を5秒間500msで点滅 10 10
スレッド2 LED2を5秒間200msで点滅 10 9

評価ボード単体で複数スレッド動作を確認するよりも、断然判り易くなります。

もちろん、評価ボード単体でも確認可能です。しかし、イベントフラグだけでなくセマフォなど今後様々なAzure RTOS機能習得にも、Arduinoプロトタイプシールド追加は、役立ちます。

また、VCP:Virtual Com Portへメッセージを出力する工夫も加え、タイトルやエラー表示を行います(評価ボード+Arduinoプロトタイプシールド動作例は、5章図)。

イベントフラグ

Microsoft公式Azure RTOS ThreadXサイト第 3 章:Azure RTOS ThreadX 機能を開き、右コラム“この記事の内容”のイベント フラグをクリックすると、イベント フラグの説明が示されます。要旨を抜粋すると、

・イベントフラグは、スレッド間同期手段。32フラグ単位グループ化可能、待ちタイムアウトなどあり
・tx_event_flags_set でフラグ設定、tx_event_flags_get でフラグ取得(AND/OR演算可能)
第 4 章:APIに、tx_event_flags_setやtx_event_flags_getの詳細記述

例えば、4章でtx_event_flags_set は、ソースコードへひな型をコピー&ペーストできる形で表現されています。

tx_event_flags_setのAPI
tx_event_flags_setのAPI

スレッド1/2

以下、説明が簡単になるので、オリジナル評価ボードソースにコメント追記したコードで説明します。

スレッド1/2は、初期設定+無限ループの簡単で単純な構成です。

スレッド1(評価ボード単体動作ソースコード)
スレッド1(評価ボード単体動作ソースコード)

スレッド1は、500msトグルを5秒間繰返し、5秒経過後、イベントフラグ:THREAD_ONE_EVTをセットします。スレッド2は、200msトグルとイベントフラグ:THREAD_TWO_EVTがスレッド1と異なるのみです。

フラグセットAPI失敗時は、Error_Handle内で停止します。

メインスレッド

メインスレッド(評価ボード単体動作ソースコード)
メインスレッド(評価ボード単体動作ソースコード)

メインスレッドは、LD2点滅シナリオを作成します。優先度が5で高優先なので、低優先スレッド1/2からのイベントフラグセットを常時ゲットできます。

スレッド1/2優先度は同一の10ですが、L170でスレッド1のイベントフラグを永遠に待つので、スレッド2はスレッド1と多重動作ができません。

スレッド2のプリエンプション閾値が9なのに、スレッド1が先に動作するのは、スレッド1がtx_thread_createで先に生成、開始(TX_AUTO_START)するからです。試しに、スレッド2を先に生成すると、LD2は200ms点滅から始まりシナリオは進みません。スレッド1→2の生成順序なら、スレッド2のプリエンプション閾値は、10でもLD2は、同じシナリオで点滅します。

スレッド1のイベントフラグを得た後、スレッド2優先度と閾値を(8、8)へ変更するのは、スレッド2単独動作のためです。その後、L179でスレッド2のイベントフラグを永遠に待ちます。

スレッド2のイベントフラグを得ると、スレッド2優先度と閾値を元の(10、9)へ変更します。このシナリオを3回繰返します。

シナリオ終わりにスレッド1/2をterminateさせるのは、動作不要だからです。terminateしなくても、メインスレッドプリエンプション閾値が5なので、スレッド1/2は動作しません。従ってLD2動作シナリオは変わりません。

シナリオは変わりませんが、terminateをコメントアウトした時のThreadX Thread Listとオリジナルの時のListが下記です。不要スレッドは、Terminate Stateへ入れると他へ影響を与えないメリットがあります。

スレッド1と2 terminate有無の差
スレッド1と2 terminate有無の差

RTOS習得とArduinoプロトタイプシールド追加

ベアメタル開発のLチカ理解に相当するのが、本稿説明のスレッド間同期イベントフラグをはじめとする多様なRTOS機能理解です。

本稿サンプルコード動作程度であれば、ベアメタルで開発する方が簡単です。但し、ベアメタルでは、動作に必要な機能を全てユーザが開発します。

一方、RTOS開発では、RTOSが提供する機能を活用し、残りの差分をユーザ開発しさえすればアプリが完成します。下図のようにベンダー提供資産(RTOS、セキュリティなどのミドルウェアやドライバ)有効活用が、現代的MCUユーザアプリケーション開発の肝です。RTOS機能が多すぎるのが、玉に瑕ですが…😂。

現代的ユーザMCU開発の例(出展:The ST blog)
現代的ユーザMCU開発の例(出展:The ST blog)

RTOS活用で、ユーザアプリケーションが資産化できます(RTOSの目的が、アプリケーション資産化なので当然です)。

メインスレッド章で説明したように、スレッド1/2はそのままで、RTOSのスレッド生成順序やプリエンプション、イベントフラグのみでLD2点滅シナリオ変更が簡単にできます。ソフトウェア規模が大きくなれば、このメインテナンス性の良さが活きてきます。

多様なAzure RTOS機能を手間なく効率的に学ぶには、Arduinoプロトタイプシールドを評価ボードに追加し、思いついたRTOS機能を直に試すことをお勧めします。

Arduinoプロトタイプシールド追加により、スレッド毎の動作を別々のLEDで目視でき、メインスレッドがスレッド2の優先度、閾値を変更しない場合、スレッド1と並列動作するか等々、様々な試行を簡単に確認できます。この試行で、ベアメタル開発経験も活かせます。

つまり、過去に開発したベアメタル機能が、RTOSに有るか無いかを、多くのRTOS機能をふるい(経験)にかけながらRTOS習得ができる訳です。

今後のAzure RTOS習得は、Arduinoプロトタイプシールドを評価ボードへ追加した構成で、新規Azure RTOSプロジェクトをRTOS機能毎に作成し行います。

新規Azure RTOS機能プロジェクト作成方法は、次回投稿予定です。

評価ボードへArduinoプロトタイプシールドを追加しスレッド毎にLED点滅中
評価ボードへArduinoプロトタイプシールドを追加しスレッド毎にLED点滅中

まとめ

STM32G4 Azure RTOS ThreadXサンプルコードを解説しました。本稿で説明したAzure RTOS APIは、下記です。

・スレッド間同期イベントフラグ:tx_event_flags_set/getと、待ち処理
・スレッド優先度、プリエンプション閾値変更:tx_thread_priority/preemption_change
・スレッド終了:tx_thread_terminateと、Terminate State目的
・スレッド生成:tx_thread_createと、TX_AUTO_START、生成順序

優先度とプリエンプション閾値をスレッド実行時に変更できる機能は、スレッド開発が容易で流用性を高め、ユーザ開発アプリケーションの資産化に効果があります。

ユーザLEDが1個のみ搭載の評価ボードを使い複数スレッド動作を確認するよりも、2個LEDやユーザS1搭載のArduinoプロトタイプシールド追加により、RTOS APIパラメタ変更時の各スレッド動作確認が容易です。

意図しないスレッド並列処理も直ぐに判るので、効率的にAzure RTOS習得ができます。Arduinoプロトタイプシールド付属の小さなブレッドボード利用も試行実験に便利です。

多くのパラメタを持つAzure RTOS効率的習得に、評価ボード+Arduinoプロトタイプシールドをお勧めします。

Azure RTOS習得(1):習得方針

Microsoft公式Azure RTOS ThreadXサイト
Microsoft公式Azure RTOS ThreadXサイト

Microsoft公式、Azure RTOS ThreadXサイトを紹介します。

前稿最後で示したSTM32G4 Azure RTOS ThreadXサンプルコード付属readme.html理解には、Azure RTOS ThreadX基礎知識が必要です。基礎知識獲得には、Microsoft公式サイトが最適です。

本稿は、公式サイトを簡単に説明し、今後のAzure RTOS習得方針を示します。

Azure RTOS習得方針

筆者は、物事を効率的に理解する時、初めはあまり細部に拘らず全体を俯瞰的に捉え、次の段階で不明な点を明らかにする、既に知っている事柄と比較する、などの方法を好みます。

Azure RTOS習得も、この方法でアプローチしたいと思います。

これは、FreeRTOS習得(2020年版)と同じ方法です。その結果、開発したのがNXP版FreeRTOSアプリケーションテンプレートです。

最終的には、STM32G4 Azure RTOS ThreadXサンプルコード付属readme.html理解とST版Azure RTOSアプリケーションテンプレート開発、2022年版Azure RTOS習得サイト作成が目標です。

Azure RTOS ThreadX公式ユーザガイド

公式サイトトップページには、Azure RTOS概要と、ユーザガイドのショートカットが掲載されています。概要は、疲れた時や気分転換時に読むとして、肝心のAzure RTOS ThreadXユーザガイドをクリックします。

現れるのが、Azure RTOS ThreadXユーザガイド目次です。

第 1 章:Azure RTOS ThreadX 概要とリアルタイム組込み開発
第 2 章:Azure RTOS ThreadX インストール
第 3 章:Azure RTOS ThreadX 機能動作
第 4 章:Azure RTOS ThreadX API
第 5 章:Azure RTOS ThreadX アプリケーションドライバー作成
第 6 章:Azure RTOS ThreadX デモアプリケーション

第3章が、Azure RTOS ThreadX理解ポイントのようです。

Azure RTOSとFreeRTOS比較:状態遷移図、優先度

Azure RTOS(左)とFreeRTOS(右)状態遷移比較
Azure RTOS(左)とFreeRTOS(右)状態遷移比較

RTOS理解に必須なのが、スレッド/タスクの状態遷移です。左が第3章:記載のAzure RTOS、右が弊社FreeRTOS習得記載のFreeRTOS状態遷移です。Azure RTOSは、全5状態ありFreeRTOS比+1、スレッド登録後、即Suspendedになる遷移もあります。

RTOS処理対象を、Azure RTOSはスレッド、FreeRTOSはタスクと呼びます。

優先度は、Azure RTOSは数値が小さい方が高く、FreeRTOSは大きい方が高い、つまり真逆です。

などのAzure RTOSとFreeRTOSの違いが第3章から判ります。

Azure RTOS ThreadXサンプルコードキーワード

・ThreadX、Thread、Event flags、Preemption threshold

前稿最後で示したSTM32G4 Azure RTOS ThreadXサンプルコード付属readme.html記載のキーワードです。サンプルコード理解には、これらが重要であることを示しています。

公式ユーザガイド第3章日本語訳によると、Preemption thresholdとは、プリエンプション閾値のこと。Azure RTOS独特の高度機能です。この部分の要旨を抜粋すると、

・プリエンプション閾値利用で、プリエンプションを無効にする優先度の “上限” を指定可能。上限より高い優先度スレッドは、引き続きプリエンプト可能だが、上限より低いスレッドは、プリエンプト不可。
・優先度20スレッドが、15~20優先スレッドグループやり取りで説明。優先度20スレッドは、セクション処理中、プリエンプション閾値を15 に設定すると、他の全スレッドのプリエンプションを防止。
・これにより、非常に重要なスレッド (優先度 0 から 14 まで)は、クリティカルセクション処理中でもスレッドをプリエンプトでき、応答性が大幅に向上。
・スレッドでプリエンプション閾値を0に設定し、全プリエンプションを無効にすることも可能。また、プリエンプション閾値は実行時に変更可能。

英語原本の機械翻訳だと思いますので、解り難い箇所もありますが、今はOKとしましょう😂。

プリエンプション:Preemptionとは

プリエンプションとは何かを、IT用語辞典から抜粋しました。

・RTOSが、実行中のスレッド/タスクを強制的に一時中断し、他のスレッド/タスク実行に切り替えること。
・このRTOS切り替えを「コンテキストスイッチ」(context switching)と呼び、プリエンプションで停止していたスレッド/タスクを再開させる操作を「ディスパッチ」(dispatch)と呼ぶ。
・殆どの現代RTOSは、「プリエンプションを利用」し処理を時分割多重。
・歴史的には、スレッド/タスク側が自ら決めたタイミングで自発的にRTOSへ制御を返却するノンプリエンプティブマルチタスク、あるいは、協調的マルチタスクもあった。

Azure RTOS/FreeRTOS、どちらもプリエンプションを利用します(FreeRTOSは本稿:状態遷移参照)。違いは、Azure RTOSが、スレッド毎にプリエンプション閾値を持つこと。RTOS任せにせずスレッドが、明示的に優先度制御を行う点です。

STM32G4 Azure RTOS ThreadXサンプルコードは、このスレッドによる優先度変更とイベントフラグが解れば解析できそうです(次回解析予定)。

まとめ

Microsoft公式Azure RTOS ThreadXサイトを利用したAzure RTOS習得方針を示しました。

STM32G4 Azure RTOS ThreadXサンプルコード付属readme.html理解に、Azure RTOS ThreadXユーザガイド第3章から、

・Azure RTOSとFreeRTOS状態遷移は異なる
・Azure RTOS優先度は0が最高位、FreeRTOSは値が大きい程優先度が高く、両者は真逆
・Azure RTOSスレッド応答性を向上させるPreemption threshold:プリエンプション閾値機能がある

などが判りました。この方針に則って、Azure RTOS習得を続けます。

STM32 Azure RTOS開発ツール拡充

2022年4月20日、STマイクロエレクトロニクス(以下ST)は、Azure RTOS開発ツールを拡充し、より幅広いSTM32MCU対応を発表しました。拡充したSTM32MCUリストが下記です。

List of STM32 with X-Cube-AZRTOS Package(出典:The ST blog)
List of STM32 with X-Cube-AZRTOS Package(出典:The ST blog)

弊社販売中STM32G0xテンプレートで使ったSTM32G0や、テンプレート開発中のSTM32G4も、Azure RTOS開発が容易になりました。

CMSIS RTOSからAzure RTOSへ

今回の発表前までは、販売中のNXP版FreeRTOSアプリケーションテンプレートに続き、STM32G4を使ってST版“CMSIS-RTOS”アプリケーションテンプレートを構想していました。

しかし、今回のAzure RTOS開発ツール充実発表を受け、“CMSIS-RTOS”から“Azure RTOS”対応へ変更することにしました。STのAzure RTOSサンプルコードが活用でき、また、Microsoft公式Azure RTOS情報もあるからです。

※ARM社規定のCMSIS RTOSは、FreeRTOSやAzure RTOSをラップ(wrapper)するRTOSです。同じCMSIS RTOS APIでFreeRTOSまたはAzure RTOSが使え、開発アプリケーション流用性は高まります。但し、ラップ関数分のオーバーヘッドが生じます。詳しくは、構想投稿の4章を参照してください。

STがAzure RTOS開発ツールMCUを拡充した背景は、Microsoft Azureクラウド接続IoT MCUの急増だと思います。リストアップした9種のSTM32MCUが、IoT MCU有力候補と言えます。

Azure RTOS開発ツールインストール方法

STM32G4を例に、Azure RTOS開発ツールインストール方法を示します。現在のSTM32G4開発ツールが、下記版数です。

・STM32CubeIDE v1.9.0               (以下CubeIDE)
・STM32CubeMX v6.5.0               (以下CubeMX)
・STM32Cube FW_G4 v1.5.0        (以下FW_G4)
・X_CUBE_AZRTOS_G4 v1.0.0    (以下AZRTOS_G4)

X-CUBE-AZRTOS-G4が、今回発表したSTM32G4のAzure RTOS開発ツールです。

FreeRTOSは、CubeMXのMiddlewareに実装済みです。一方、Azure RTOS は、ExpansionsパッケージのAZRTOS_G4によりCubeMXへ機能追加します。Expansionsパッケージ追加のため、少し手間がかかります。

① CubeIDEのHelp>Manage Embedded Software Packagesクリック
② Embedded Software Packages ManagerのSTMicroelectronicsタブ選択
③ X_CUBE_AZRTOS_G4のAvailable Version 1.0.0を選択し、Installクリック

X-CUBE AZRTOS-G4のインストール
X-CUBE AZRTOS-G4のインストール

AZRTOS_G4インストール後、使用コンポーネントの選択が必要です。

④ CubeMXのPinout & Configurationタブ内Software Packsをクリック
⑤ Select Components(Alt+O)を開き、Software Packs Component Selectorで追加Azure RTOSコンポーネント:RTOS ThreadX/File system FileX/USB LevelX…などを選択し、OKクリック

STM32G4評価ボード:NUCLEO-G474REを使う場合は、RTOS ThreadXを選択し、Core/Low Power supportを選択すれば十分です。但し、念のため、Performance InfoやTraceX supportも選択しておきます。

インストールしたAzure RTOS ThreadX版数が、6.1.8であることも判ります。

Software Packs Component Selector
Software Packs Component Selector

Azure RTOS ThreadXサンプルコードインポートと動作確認

インストールしたAZRTOS_G4が正常動作するかをAzure RTOS ThreadXサンプルコードと評価ボード:NUCLEO-G474REで確かめます。確認方法が下記です。

① CubeIDEのInformation CenterからImport STM32Cube exampleをクリック
② STM32 Project from STM32Cube ExamplesのExample Selectorタブで、BoardのName:NUCLEO-G474RE、Middleware:ThreadXを選択

STM32G4評価ボード:NUCLEO-G474REのAzure RTOSサンプルコード
STM32G4評価ボード:NUCLEO-G474REのAzure RTOSサンプルコード

STM32G4 Azure RTOS ThreadXサンプルコードは、現在3個です。最も基本的な、

③ Tx_Thread_Creationを選択し、Finishクリック。CubeIDEへTx_ThreadX_Creationサンプルコードがインポート。
④ CubeIDEのTx_Thread_Creation.iocをクリックし、CubeMXで、Generate Code(Alt+K)を実行
⑤ CubeIDEでTx_Thread_Creationをビルドし、評価ボードへダウンロード
⑥ 評価ボードのLED2が、500ms点滅と200ms点滅を3回繰返し、その後1秒点滅に変わる

以上で、STM32G4 Azure RTOS開発ツールのX_CUBE_AZRTOS_G4インストールを、ThreadXサンプルコードで動作確認しました。

使用したTx_ThreadX_Creationサンプルコードの説明は、次週以降に行う予定です。直ぐ知りたい方は、Tx_ThreadX_Creationフォルダ内readme.htmlを参照してください。

まとめ

STが、STM32G0やSTM32G4、STM32U5などのIoT MCUに対し、Azure RTOS開発ツール拡充を発表しました。

STM32G4を例に、CubeMXへExpansionsパッケージのX_CUBE_AZRTOS_G4でAzure RTOS機能の追加方法、Azure RTOS ThreadXサンプルコードインポート、NUCLEO-G474REでThreadXサンプルコードの動作確認をしました。

STM32G0(Cortex-M0+/64MHz)、STM32G4(Cortex-M4/170MHz)、STM32U5(Cortex-M33/160MHz)は、弊社IoT MCUテンプレートの開発対象です。

今回の発表を受け、STM32G4のRTOSを、CMSIS-RTOSからAzure RTOSへ変更し、ST版Azure RTOSアプリケーションテンプレート開発を計画中です。

RAファミリのRTOS

RAファミリは、FreeRTOSとAzure RTOS、両方に対応しています。このうち、FSP v3.6.0でサンプルコードを提供しているのがFreeRTOSです(プロジェクト名:freertos_評価ボード名_ep)。

本稿は、このFreeRTOSサンプルコードを簡単に解説します。

キューとセマフォ利用サンプルコード

freertos_fpb_ra6ep1_epのユーザ追加部分とFSP生成ソースコード
freertos_fpb_ra6ep1_epのユーザ追加部分とFSP生成ソースコード

最新版FSP v3.6.0のRA6E1評価ボードサンプルFPB-RA6E1 Example Project BundleのRTOSサンプルコードが、上図freertos_fpb_ra6e1_epです(freertos_fpb_ra4e1_epも同じ)。

ユーザ追加RTOSタスク:キュー送信タスク、受信タスクと、定期割込みでセマフォ生成し、生成セマフォ取得でRTT Viewerへメッセージ出力するタスクの、合計3タスクを追加(タスクプライオリティ同一)。

ユーザ追加RTOSオブジェクト:キューとセマフォの2オブジェクトを追加。

FSP生成ソースコード:追加タスク毎にFSPが entry.c 生成(中身は、下図右側)。

ベアメタル処理とFreeRTOSタスク処理並列多重
ベアメタル処理とFreeRTOSタスク処理並列多重

基本的には、FreeRTOS公式Hardware independent FreeRTOS exampleや、弊社NXP版FreeRTOSアプリケーションテンプレートと同様の処理。

詳細は、FreeRTOSアプリケーションのQueueデータ送受信FreeRTOSサンプルプロジェクトfreertos_generic詳細などの関連投稿をご覧ください。

RAファミリRTOS現状まとめ

FSPを使ったRAファミリFreeRTOS/Azure RTOSの現状をまとめると、下記です。

・FreeRTOS習得スタートは、キューとバイナリセマフォオブジェクト理解(弊社FreeRTOSアプリケーションテンプレートも同様)。
・ベアメタル開発では使わないObjects窓へ、バイナリセマフォ/ミューティックス/キューなどFreeRTOSの8オブジェクト追加。Azure RTOSは4オブジェクト追加。

FreeRTOSとAzure RTOSの追加可能Objects
FreeRTOSとAzure RTOSの追加可能Objects

・Azure RTOS関連資料は、Microsoft公式のコチラ
・FSP v3.6.0提供FreeRTOSサンプルコード数は、1個。Azure RTOSサンプルコードは未提供。

あとがき

RAベアメタルテンプレートを先週発売した直後に今回RTOSの投稿をしたのは、ベアメタル/RTOSに関係なく「RAファミリ開発の鍵はFSP」を示したかったからです。

FSPは、RAファミリのMCU資源(MCUコア/内蔵周辺回路など)を対象に、HAL APIを生成するツールです。開発者は、FSPが生成したHAL APIを使ってRAファミリのアプリケーションを開発します。

FSP対象は、ベアメタルの場合は、MCUコアやIOポートなど実際の回路、RTOSの場合は、タスクやスレッド、RTOSが提供するセマフォやキューなどの様々なオブジェクト(≒仮想回路)が、ベアメタル対象に加わるだけと考えると判り易いと思います。

FSPは、ベアメタル開発用をベースにRTOS開発へも対応し、プライオリティなどRTOS独特の設定も、ベアメタルと同様のGUIで設定します。

つまり、ベアメタルとRTOS両方対応FSPを上手く使いこなせるかが、RAファミリソフトウェア開発の鍵です。効率的にFSPを習得する最初のツールが、RAベアメタルテンプレートと言えます😄。

RAベアメタルテンプレートでFSP習得
RAベアメタルテンプレートでFSP習得

次の段階、つまりRTOS開発へ対応したRAテンプレートも思案中です。ただ、RAベアメタルテンプレートご購入者様からの様々なフィードバックやFSPのRTOSサンプルコード数が増えた後、暫くしてから実現するつもりです。

先ずは、RAベアメタルテンプレートでRAファミリ開発の鍵、FSPを習得してください。ご購入、お待ちしております。

RAベアメタルテンプレート発売

FPB-RA6E1で動作中のSimpleTemplateとRTT Viewer
FPB-RA6E1で動作中のSimpleTemplateとRTT Viewer
FPB-RA4E1で動作中のBaseboardTemplateとRTT Viewer
FPB-RA4E1で動作中のBaseboardTemplateとRTT Viewer

ルネサスCortex-M33コア搭載RAファミリ向けRAベアメタルテンプレート(税込1000円)を本日より発売します。概要、仕様、テンプレート提供プロジェクト構成は、コチラから無料ダウンロードできますので、ご検討ください。

RAファミリのポジション

RAファミリ位置づけ(出展:記事に加筆)
RAファミリ位置づけ(出展:記事に加筆)

ルネサスのARM Cortex-M系MCUは、競合他社比、発売が出遅れました。RXやSynergyなどの独自32ビットMCUファミリも供給中のルネサスRA位置づけが上図です。詳細は、コチラの関連投稿3章に説明済みです。

まとめると、RAファミリは、外付けE2エミュレータなどが不要の低価格評価ボードと容量制限なし無償コンパイラ利用など、他のルネサス32ビットファミリには無い個人レベルでも開発可能なARM Cortex-M33/M23/M4コア採用IoTセキュリティ強化MCUです。

RAファミリ開発の鍵:FSP

Flexible Software Package構成
Flexible Software Package構成

RAファミリ開発の鍵は、FSP:Flexible Software Packageです。一言で言うと、HAL APIコード生成ツール。MCU動作速度、内蔵周辺回路などのパラメタをGUIにより設定後、RAファミリ間で共通のHAL APIを一括生成します。
※HAL:Hardware Abstraction Layer

FSP活用で、RAファミリ間での移植性に優れたソフトウェア開発ができます。しかしながら、多くのパラメタをGUI上で設定するため、煩雑で特に初心者にとっては取っ付きづらい面もあります。

また、競合他社より後発のIoT向けMCUですので、FreeRTOSやAzure RTOS、TrustZoneなどのIoTセキュリティにも対応しています。RAファミリの拡張性、将来性を提供するツールがFSPです。

つまり、FSP習得が、RAファミリを使いこなす鍵です(コチラの関連投稿で詳細が判ります)。

RA6/4E1グループ選択理由

RAファミリカタログ(出典:ルネサス)
RAファミリカタログ(出典:ルネサス)

様々なラインナップを供給するRAファミリの中で、汎用性と超低価格な評価ボードも供給済みなのが、RA6E1グループ(Cortex-M33/200MHz)とRA4E1(Cortex-M33/100MHz)グループです。

※RA6E1評価ボード:FPB-RA6E1、RA4E1評価ボード:FPB-RA4E1

RA6/4E1グループとFSPで開発したソフトウェアは、RAファミリ間で共通に使える汎用性を持ちます。また、評価ボードで動作するFSPサンプルコードもありますので、FSP習得にも適しています。

RA6とRA4の分岐点は、最大動作周波数です。

240MHz動作のRA6は、大容量Flashを搭載し、高性能で多機能MCUマーケットを狙い、更に高性能なRA8シリーズへの発展性があります。100MHz動作のRA4は、高性能低消費電力MCUマーケット狙いで、Cortex-M23搭載5Vトレラント性も持つRA2シリーズへ高い親和性を持ちます。

従って、RAファミリ開発を始めるMCUとして、RA6/4E1グループいずれも適していると言えるでしょう。

※RA6最大動作周波数は、カタログでは240MHzとありますが、RAベアメタルテンプレートで用いた評価ボードFPB-RA6E1は、最大200MHz動作です。他RA6シリーズも、同様に現在200MHzです。
※RA8シリーズは、未発売です。

実務直結RAベアメタルテンプレートでFSP習得

近い将来、RTOSやTrustZoneなど、多くのIoT MCU技術を学ぶ必要があります。それでも、MCUの基本技術は、ベアメタルです(コチラの関連投稿参照)。

弊社RAベアメタルテンプレートVersion 1は、RAファミリ中核汎用RA6/4E1グループの超低価格評価ボードを使い、基本のベアメタル開発で、効率的にFSPを習得することが目的です。

FSP習得には、評価ボードサンプルコードが適しますが、サンプルコードは、複数処理が当然の実務応用が簡単ではありません。弊社テンプレートは、複数サンプルコードの活用・流用が簡単で、実務にも使えます。

弊社テンプレートと詳細な説明資料、安価で簡単、拡張性にも優れた推薦開発環境を使えば、誰でも簡単にMCUベアメタル開発の高い障壁を乗越えられ、かつ、FSP習得も可能です。

RAベアメタルテンプレート購入方法は、コチラを参照してください。ご購入、お待ちしております。

RAファミリ開発環境Tips

ルネサス統合開発環境:e2 studioが、2022-01へバージョンアップされました(2022年1月16日号TOOL NEWS)。RAファミリは、「ソフトウェアパッケージ(=FSP)が同梱されたインストーラをダウンロードしインストールを行うこと」と、アップデート方法に注意書きがあります。

ところが、リンク先インストーラのe2 studioバージョンは、本日時点で昨年12月9日のFSP v3.5.0更新時、2021-10のままです。e2 studioは旧バージョンのため、2022-01へ手動にてアップグレートが必要です。

RAファミリ開発環境 GitHub状況

上記のように、RAファミリ開発環境は

・統合開発環境:e2 studio
・FSP(Flexible Software Package)とFSP版数に対応した評価ボードサンプルコード

の2種類、サンプルコードを含めると3種類が、それぞれ別タイミングでバージョンアップします。

また、ダウンロード先がGitHub内にあるため、RAファミリ開発環境の全体像と役割を把握していないと、混乱が生じます。そこで本稿で、整理します。

ちなみに、本日時点のRAファミリ開発環境GitHub状況が下図です。

GitHub上のRAファミリ開発環境のFSPとe2 studio(橙色がニュースリンク先)
GitHub上のRAファミリ開発環境のFSPとe2 studio(橙色がニュースリンク先)
GitHub上のRAファミリ評価ボードのサンプルコード
GitHub上のRAファミリ評価ボードのサンプルコード

RAファミリ開発環境 全体像と役割

「主役はFSP、e2 studioは脇役」、これがRAファミリ開発環境の役割です。

従って、FSPバージョンアップ時は、新FSP用ワークスペースを作成し、ここへ、旧FSP開発アプリケーションをコピー(インポート)、新FSPワークスペースでRAアプリケーション開発を継続するのがお勧めの開発手法です。

※HAL API生成ツールがFSPです。つまり、HAL(Hardware Abstraction Layer)より上位のRAアプリケーションは、FSP版数に依存しないのが本来の姿です。現状のFSPは、HAL API自体も変わる可能性があり「下位互換性」が未保証のため、安全策をとります。

もちろんe2 studioバージョンアップ時も別フォルダへインストールすれば、新旧両e2 studioの併用が可能です。但し、脇役e2 studioは、主役FSPほどの安全策は不要です。

例えば、前章のFSP v3.5.0インストーラのe2 studio 2021-10を手動更新(e2 studio>ヘルプ(H)>更新の検査クリック)し、2021-10へ上書きインストールした場合は、初めにインストールしたC:\Renesas\RA\e2studio_v2021-10_fsp_v3.5.0フォルダへ、e2 studio 2022-01が上書き更新されます(赤字v2021-10部分は不変)。

手動更新が成功したかを確認するには、e2 studio>ヘルプ(H)>e2 studioについて(A)をクリックし、下記ダイアログVersion:2021-10部分が、2022-01へ変わったことを目視確認します。

e2 studio 2021-10の手動2022-01更新確認方法
e2 studio 2021-10の手動2022-01更新確認方法

主役FSP更新、脇役e2 studio同一版対処

e2 studioはバージョンアップなし、FSPのみバージョンアップする場合は、GitHubからFSP_Packs_<version>.zipをダウンロードしインストールすれば、FSPのみの更新も可能です。この場合は、e2 studio内で新旧FSPが選択可能です。

この場合も、新旧FSPで開発アプリケーションのワークスペース分離が無難です。

理由は、プロジェクトのFSP設定ファイル:configuration.xmlにFSP利用版数が記述されており、旧FSPを新FSPへ変更する場合、下記ワーニングが表示されるからです。OKクリックで新FSPがアプリケーションへ適用されます。

アップグレートFSPへの変更方法とワーニング表示(FSP v3.4.0→v3.5.0の例)
アップグレートFSPへの変更方法とワーニング表示(FSP v3.4.0→v3.5.0の例)

利用FSP変更後、Generate Project Contentをクリックし新FSPでのHAL APIを再生成、当該プロジェクトクリーン、再ビルドでコンパイル成功すれば、同じアプリケーションで新旧FSPが使えます。

FSPアップグレートは、新規RAファミリ追加、新規周辺回路追加など、「旧FSP提供以外の新規追加」が主な内容ですので、基本的に旧FSP開発アプリケーションは、新FSPでもコンパイル成功するハズです。

評価ボードサンプルコードがFSP版数対応なのは、これら「新規追加の使用例」を示すためです。(もちろん、旧FSPバグ修正も含む)。

※但し、RTOS関連アップデートもFSP更新に含まれることには注意してください。RAベアメタル開発では、新旧FSPコンパイル成功確率は高いハズですが、RTOS開発時は、新FSPリリースノートに目を通し、RTOS関連の変更有無確認が必要です。

コンパイル不成功の時は、新FSP環境で当該プロジェクト再設計が必要になります。

まとめ

RAファミリ開発環境は、新旧版が全てGitHub内にあり、統合開発環境e2 studio、FSP、評価ボードサンプルコードのアップグレートがそれぞれ別タイミング、付属説明も簡易なため混乱します。混乱回避のためにRAファミリ開発環境の役割とFSP更新Tipsを示しました。

FSPが主役、e2 studioは脇役、これがRAファミリ開発環境の役割です。FSPアップグレート時は、新旧FSPワークスペースを分離し、新FSPワークスペース内で再度HAL APIを生成、生成HAL APIがそのまま旧アプリケーション上でコンパイル成功すれば、安全にFSP更新ができます。

おまけ:Windows 11アップグレート

WIndows 11アップグレート可能通知
WIndows 11アップグレート可能通知

弊社Windows 10 21H2に、Windows 11アップグレートOK通知が届きました。

弊社のPCは、IoTベンダのMCU開発ツールが主役、Windowsは脇役です。今すぐの11アップグレードはNGですので、「今はWindows 10の使用を継続します」をクリックし対処しました(なお、Windows 10 21H2大型更新方法は、コチラの関連投稿を参照)。

多くのIoT MCU開発ツールの公式推薦Windows OSは、未だWindows 10です。

公式推薦OSが、Windows 11に変った後に11化しても遅くはありません。今秋の11大型更新に向け11も進化中ですので、状況観察します。