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アプリケーションテンプレート開発を計画中です。

組込み開発 基本のキ:RTOS vs. ベアメタル

RTOS vs. BareMetal
RTOS vs. BareMetal

2022年最初の投稿は、RTOSとベアメタルを比較します。RTOSを使わないベアメタルMCU開発者が多いと思いますので、RTOS開発メリット/デメリットをベアメタル側から評価、RTOSデバッグツール紹介とベアメタル開発の意味を考えました。

RTOS目的

Flexible Software Package構成
Flexible Software Package構成

ルネサスRAファミリのFlexible Software Package構成です。左上Azure RTOSやFreeRTOSの中に、ConnectivityやUSBがあります。これらMCU共有資源を管理するシステムソフトウェアがOSで、PCのWindowsやMac、Linuxと機能的には同じです。

Real-Time性が必要な組込み用OSをRTOSと呼び、FreeRTOSやAzure RTOSが代表的です。これは、IoT MCU接続先が、Amazon Web Services(AWS)クラウドならばFreeRTOSライブラリ、Microsoft AzureクラウドならAzure RTOSライブラリ(図のConnectivity)利用が前提だからです。

※2021年のIoTクラウドシェアは、コチラの関連投稿からAWS>Azure>GCPの順です。

RAファミリに限らず、クラウド接続のIoT MCUは、これらRTOSライブラリを使ったRTOS開発になります。

RTOSメリット/デメリット

例えば、ベアメタルでUSB制御を自作する場合は、USB 2.0/3.0などの種類や速度に応じた作り分けが必要です。ライブラリがあるRTOSなら、USBポートへの入出力記述だけで利用可能です。RTOSが共有資源ハードウェア差を吸収し、アプリケーションが使い易いAPIを提供するからです。

RTOSの資源管理とは、MCUコア/Flash/RAM/周辺回路/セキュリティなどの共有資源を、アプリケーション側から隠蔽(≒ブラックボックス化)すること、とも言えます。

RTOSアプリケーションは、複数タスク(スレッドと呼ぶ場合もあり)から構成され、タスク間の優先制御もRTOSが行います。開発者は、単体処理タスクを複数開発し、それらを組み合わせてアプリケーションを構成します。RTOSアプリケーション例が下図、灰色が開発部分、コチラが関連投稿です。

Data flow diagram for a smart thermostat(出展:JACOB'S Blog)
Data flow diagram for a smart thermostat(出展:JACOB’S Blog)

RTOS利用メリット/デメリットをまとめます。

メリットは、

・RTOSライブラリ利用により共有資源活用タスク開発が容易
・移植性の高いタスク、RTOSアプリケーション開発が可能
・多人数開発に向いている

デメリットは、

・複数タスク分割や優先順位設定など、ベアメタルと異なる作り方が必要
・共有資源、特にRAM使用量がタスク数に応じて増える
・RTOS自身にもバグの可能性がある

簡単に言うと、RTOSとベアメタルは、「開発作法が異なり」ます。

ソフトウェア開発者は、RTOS利用と引換えに、自己流ベアメタル作法を、RTOS作法へ変えることが求められます。RTOS作法は、標準的なので多人数での共同開発が可能です。もちろん、ベアメタルよりもオーバーヘッドは増えます。このため、RTOS利用に相応しい十分なMCUコア能力も必要です。

RTOSタスク開発 vs. ベアメタルアプリケーション開発

最も効果的なRTOS作法の習得は、評価ボードを使って実際にRTOSタスク開発をすることです。弊社FreeRTOSアプリケーションテンプレートは、この例です。

それでも、RTOSタスク開発作法を文章で記述すると、以下のようになります。

開発対象がアプリケーションからタスク(スレッド)へ変わることが、ベアメタルとの一番の違いです。Windowsタスクバーにあるフィルダ表示や、ペイントなどと同様、タスクは、単機能の小さいアプリケーションとも言えます。

このタスクを複数開発し、複数タスクを使ってRTOSアプリケーションを開発します。タスクには、それぞれ優先順位があり、他のタスクとの相対順位で実行タスクがRTOSにより決まります。タスクの状態遷移が、RTOSへの備え:第2回、タスク管理で示した下図です。

FreeRTOS Task States
FreeRTOS Task States

ベアメタルアプリケーションとは異なり、優先順位に応じてタスクが実行(Running)され、その実行も、定期的に実行可能状態(Ready)や待ち状態(Suspended)、停止状態(Blocked)へRTOSが変えます。これは、リアルタイムかつマルチタスク処理が、RTOSの役目だからです。遷移間隔などは、RTOS動作パラメタが決めます。

ベアメタル開発は、開発者が記述した通りに処理が実行されますが、RTOS開発のタスク実行は、RTOS任せです。RTOS開発難易度の上がる点が、ここです。

一般的なIoT MCUは、シングルコアですので、実行タスク数は1個、多くの他タスクは、Not Running(super state)状態です。RTOSがタスクを実行/停止/復活させるため、スタックやRAM使用量が急増します。

これら文章を、頭の中だけで理解できる開発者は、天才でしょう。やはり、実際にRTOSタスクを開発し、頭の中と実動作の一致/不一致、タスク優先順位やRTOS動作パラメタ変更結果の評価を繰返すことで、RTOS理解ができると凡人筆者は思います。

ベアメタル開発者が手早くRTOSを理解するには、既にデバッグ済みの複数RTOSタスク活用が便利で、FreeRTOSアプリケーションテンプレートは、この要求を満たしています。概要は、リンク先から無料ダウンロードできます。

文章でまとめたFreeRTOS解説が、コチラの弊社専用ページにあります。また、本ブログ検索窓にFreeRTOSと入力すると、タスク開発例などが参照できます。

RTOSデバッグツール

percepio tracealyzer
percepio tracealyzer

さて、RTOS作法に則ってタスク開発し、RTOS動作パラメタも適切に設定しても、思ったように開発タスクが動作しない時は、ブラックボックスRTOS自身のバグを疑う開発者も多いでしょう。RTOSのバグ可能性もありえます。

この疑問に対して強力にRTOS動作を解析できるFreeRTOSデバッグツールがあります。資料が無料でダウンロードできますので、紹介します。

※このツールを使うまでもなく、弊社FreeRTOSアプリケーションテンプレートは、正常動作を確認済みです。

まとめ:RTOS vs. ベアメタル

IoT MCUのクラウド接続 → 接続クラウド先のRTOSライブラリ必要 → RTOSライブラリ利用のRTOS開発が必要、という関係です。

RTOS開発は、ベアメタルと開発作法が異なる複数タスク開発です。タスクは、優先順位に応じてRTOSがMCU処理を割当てます。また、MCU共有資源がRTOSアプリケーションから隠蔽されるため、移植性が高く多人数での大規模開発にも向いています。

一方で、RTOSオーバーヘッドのため、ベアメタルよりも高いMCU能力が必要です。

シングルコアMCUでは、RTOSとベアメタルのハイブリッド開発は困難です。開発者がRTOSを利用するなら、慣れたベアメタル開発から、RTOSタスク開発への移行が必要です。

ベアメタル開発経験者が、効果的にRTOSタスク開発を習得するには、評価ボードと複数RTOSタスクが実装済みの弊社RTOSアプリケーションテンプレートの活用をお勧めします。

ベアメタル開発意味

RTOSのタスク処理待ち(セマフォ/Queue)を使うと、ベアメタルよりも排他/同期制御が簡単に記述できます。それでも、全てのMCU開発がRTOSへ移行することは無いと思います。様々なセンサデータをAD変換するエッジMCUは、ベアメタル開発、エッジMCUを複数個束ねクラウドへ接続するIoT MCUは、RTOS開発などがその例です。

MCU開発の基本は、やはりRTOS無しの「ベアメタル開発」です。

IoT MCU開発者スキルの階層構造
IoT MCU開発者スキルの階層構造

ベアメタル開発スキルを基にRTOSを利用してこそ、RTOSメリットを活かしたタスクやアプリケーション開発ができます。共有資源ブラックボック化、多人数開発のReal-Time OSは、「ベアメタル開発の補完」が起源です。

PC OSとは全く逆のこの生い立ちを理解していないと、効果的なRTOS利用はできません。近年MCU性能向上は著しいのですが、向上分をRTOSだけに振り分けられる程余裕はなく、IoTセキュリティなどへも配分する必要があります。

この難しい配分やRTOS起因トラブルを解決するのが、ベアメタル開発スキルです。弊社マイコンテンプレートは、主要ベンダのベアメタル開発テンプレートも販売中、概要ダウンロード可能です。

組込み開発 基本のキ:バックナンバー

2022年最初の投稿に、筆者にしては長文すぎる(!?)のRTOS vs. ベアメタルを投稿したのは、今年以降、RTOS開発が急速に普及する可能性があるからです。

クラウド接続からRTOS必要性を示しましたが、セキュリティなど高度化・大規模化するIoT MCU開発には、移植性の高さや多人数開発のRTOSメリットが効いてきます。

また、半導体不足が落ち着けば、RTOS向き高性能MCUの新しいデバイスが、各ベンダから一気に発売される可能性もあります。スマホ → 車載 → IoT MCUが、半導体製造トレンドです。

※現状のMCUコア関連投稿が下記です。
Cortex-M33とCortex-M0+/M4の差分
Cortex-M0からCortex-M0+変化
Cortex-M0/M0+/M3比較とコア選択

IoT MCU開発が複雑化、高度化すればする程、前章のベアメタル開発や、組込み開発の基礎技術:基本のキの把握が、開発者にとって益々重要になります。

組込み開発、基本のキ:バックナンバーを示します。年頭、基本を再確認するのはいかがでしょう?
組込み開発 基本のキ:組込み処理
組込み開発 基本のキ:IoT MCUセキュリティ



RAファミリFSP v3.5.0更新

ルネサスRAファミリのFSP(Flexible Development Package)が、12月9日、v3.5.0へ更新されました。RAファミリの特徴は、コチラの3章に投稿済みです。下記が、抜粋した2項目です。

・ARM Cortex-M33/M23/M4コア採用でIoTセキュリティ強化
・Eclipse IDEベースのKeilやIARなどのARM Ecosystemと無償GNUコンパイラ利用可能

RAファミリヒットの予感!

筆者は、RAファミリが、IoT MCU日本人開発者にヒットする予感がします。

Arduinoシールドコネクタ付き+外付けエミュレータ無しで開発できる低価格評価ボード、コンパイラ容量制限無し、CMSIS開発などは、競合他社に追いついた感じですが、FreeRTOS/Azure RTOS両RTOSへの早い対応、オリジナル内蔵周辺回路や買収各社のフロントエンド化、SOTBなどの製造プロセスは、多くのルネサス開発経験者を引き付ける魅力を持つからです。

この魅力を最大限引出すツールが、FSPです。簡単に言うと、HAL(Hardware Abstraction Layer)API生成SDK(Software Development Kit)です。ルネサスは、Smart Configuratorと呼んでいますが…。

RA開発ポイントFSP構成

FSP v3.5.0の詳細は、ユーザーズマニュアル:UM(英文、全3206ページ)を参照してください(ページ数が多いのは、Chapter 4以降がAPIレファレンスだからです)。FSP構成を示します。

Flexible Software Package構成
Flexible Software Package構成

FSP生成HAL APIを利用すると、RAファミリ共通のアプリケーション開発ができます。また、FSPは、例えばREファミリなど、他のCortex-M系ファミリへ発展する可能性もあります。HALが、コア差を隠蔽できるからです。

※図からRenesas版CMSISと考えると判り易く、CMSISは、コチラの関連投稿3章を参照。

IoT MCUでは、アプリケーションの流用性、移植性は重要です。従来よりも開発規模が大きく、しかも、セキュリティなどのIoT技術適用には、業界標準インターフェースでの機能流用が効率的だからです。既存アプリケーションを出来るだけ流用し、顧客の新規追加開発部分を最小化することで早期開発を実現します。

RAファミリの開発ポイントは、FSPです。

UMの2.3 Tutorial: Your First RA MCU Project – Blinkyと2.4 Tutorial: Using HAL Driversを読んで解る方は、2.5 Primer: ARM TrustZone Project Developmentで、IoT MCUポイント:TrustZoneの理解をお勧めします。具体的なTrustZoneサンプルコードは、検索中です。見つかりましたら、本ブログで投稿します。

2.3や2.4が不明な方は、コチラの関連投稿を参考にしてください。

日本語FSP解説

RAファミリビギナーズガイド
RAファミリビギナーズガイド

日本語FSP解説が欲しい方は、RAファミリビギナーズガイド(全114ページ)の2~3章が役立ちます。但し、掲載サンプルコードは、UMに比べ少数です。

このガイドで注目して頂きたいのが、P98の下記です。

“セキュリティは重要です。また、それは後で追加することはできないため、初期段階から考える必要があります。少なくとも、コストのかかる再設計があれば、それに基づいてアプリケーション全体を破棄することも必要になるかもしれません。これは建物の土台と考えてください。それ自体は……。
それでも、この接続された世界の全てのアプリケーションにはセキュリティが不可欠なのです。”

IoT MCUのセキュリティ土台には、Cortex-M33のTrustZoneが業界標準です。Cortex-M33のRAファミリをプロトタイプ開発に使う理由は、後で追加できないTrustZoneが土台に内蔵のためです。

プロトタイプ開発初期は、TrustZone未使用でも構いません。後でIoTセキュティを追加する際に、プロトタイプ開発で使った土台を変更せずに内蔵TrustZoneを使えること、これがRAファミリをIoTプロトタイプ開発に使う最大メリットです。

FSP活用RAテンプレート構想

RAテンプレートは、FPB-RA6E1とFPB-RA4E1両方で動作確認
RAテンプレートは、FPB-RA6E1とFPB-RA4E1両方で動作確認

FSPには、多くのサンプルコードが掲載されています。弊社は、これら複数サンプルコードを簡単に流用し、早期プロトタイプ開発に使えるRAテンプレートv 1.0を、来年1Q目途に開発、RAファミリ中核MCUのRA6/4シリーズ評価ボードRA6E1/RA4E1の両方で動作確認し、販売を予定しています。

※既に販売中の各種テンプレートは、コチラをご覧ください。

最初にリリースするRAテンプレートv 1.0は、UM 2.3/2.4理解や基礎的なRA習得に役立つ初心者向けベアメタルプロトタイプ開発テンプレートとし、中級以上の開発者向けRTOS関連やTrustZoneは、v2.0以降で対応予定です。

RAテンプレートを使えば、FSP掲載の複数サンプルコードを流用したIoTプロトタイプ開発が、早期にできます。

IoTスキル獲得最適RAファミリ

全てのモノがネットへ接続するIoT時代は、開発対象が増えますが、“競合”開発者も増えます。本ブログ読者には、スキルを活かした更なる効率的開発が求められます。

読者個人によるIoTキーポイントのスキル習得は、自分への先行投資です。キーポイントとは、現行MCU開発スキルに加え、IoTセキュティとRTOSです。

個人レベルでこれらセキュティとRTOSスキル獲得に、Cortex-M33のRAファミリは最適です。前章の低コストの評価ボードと業界標準Eclipse IDEベース“無償”ARM Ecosystem(=e2 studio+FSP)が、ルネサスサイトから簡単に入手でき、入手後、スグに開発着手できるからです。コンパイラ容量制限もありません。

また、初心者はもちろん、中級以上のIoTスキル習得意欲を満たすルネサス公式情報も豊富です。コチラが、公式RAファミリ動画です。短い動画が多数ありますので、すきま時間でのチェックに適しています。

e2 studio日本語メニュー vs. 英語メニュー

e2 studio日本語メニュー化
e2 studio日本語メニュー化

日本語メニューのe2 studioを使うには、インストール時、カスタマイズ機能でJapanese Language Supportコンポーネントの手動追加が必要です。筆者は、英語メニューを愛用していますが、FSP v3.5.0更新を期に、試しに日本語化してみました。

日本語メニューは、横幅が広くなりますがショートカットキー付きです。また、全メニューが日本語訳になる訳ではありません。好みの問題ですが、競合他社Eclipse IDE同様、英語の方が使いやすいと筆者は感じました。

Cortex-M4評価ボードRTOSまとめ

低価格(4000円以下)、個人での入手性も良い32ビットARM Cortex-M4コア評価ボードのRTOS状況を示します。超低価格で最近話題の32ビット独自Xtensa LX6ディアルコアESP32も加えました。

Vendor NXP STマイクロ Cypress Espressif Systems
RTOS FreeRTOS
Azure RTOS
CMSIS-RTOS FreeRTOS
Mbed OS
FreeRTOS
Eva. Board LPCXpresso54114 NUCLEO-G474RE CY8CPROTO-063-BLE ESP32-DevKitC
Series LPC54110 STM32G4 PSoC 6 ESP32
Core Cortex-M4/150MHz Cortex-M4/170MHz Cortex-M4/150MHz
Cortex-M0+/100MHz
Xtensa LX6/240MHz
Xtensa LX6/240MHz
Flash 256KB 512KB 1024KB 480KB
RAM 192KB 96KB 288KB 520KB
弊社対応 テンプレート販売中 テンプレート開発中 テンプレート検討中 未着手

※8月31日、Cypress PSoC 6のRTOSへ、MbedOSを追加しました。

主流FreeRTOS

どのベンダも、FreeRTOSが使えます。NXPは、Azure接続用のAzure RTOSも選択できますが、現状はCortex-M33コアが対応します。ディアルコア採用CypressのRTOS動作はM4側で、M0+は、ベアメタル動作のBLE通信を担います。STマイクロのCMSIS-RTOSは、現状FreeRTOSをラップ関数で変換したもので実質は、FreeRTOSです(コチラの関連投稿3章を参照してください)。

同じくディアルコアのEspressifは、どちらもRTOS動作可能ですが、片方がメインアプリケーション、もう片方が通信処理を担当するのが標準的な使い方です。

価格が上がりますがルネサス独自32ビットコアRX65N Cloud Kitは、FreeRTOSとAzure RTOSの選択が可能です。但し、無償版コンパイラは容量制限があり、高価な有償版を使わなければ開発できないため、個人向けとは言えません。

※無償版でも容量分割と書込みエリア指定など無理やり開発するトリッキーな方法があるそうです。

クラウドサービスシェア1位のAWS(Amazon Web Services)接続用FreeRTOSが主流であること、通信関連は、ディアルコア化し分離処理する傾向があることが解ります。

ディアルコア

ディアルコアで通信関連を分離する方式は、接続クラウドや接続規格に応じて通信ライブラリやプロトコルを変えれば、メイン処理側へ影響を及ぼさないメリットがあります。

例えば、STマイクロのCortex-M4/M0+ディアルコアMCU:STM32WBは、通信処理を担うM0+コアにBLEやZigBee、OpenThreadのバイナリコードをSTが無償提供し、これらを入れ替えることでマルチプロトコルの無線通信に対応するMCUです。

メイン処理を担うM4コアは、ユーザインタフェースやセンサ対応の処理に加え、セキュティ機能、上位通信アプリケーション処理を行います。

通信処理は、クラウド接続用とセンサや末端デバイス接続用に大別できます。

STM32WBやCY8CPROTO-063-BLEが採用した末端接続用のBLE通信処理を担うディアルコアのCortex-M0+には、敢えてRTOSを使う必要は無く、むしろベアメタル動作の方が応答性や低消費電力性も良さそうです。

一方、クラウド接続用の通信処理は、暗号化処理などの高度なセキュティ実装や、アプリケーションの移植性・生産性を上げるため、Cortex-M4クラスのコア能力とRTOSが必要です。

デュアルコアPSoC 6のFreeRTOS LED点滅

デュアルコアPSoC 6対応FreeRTOSテンプレートは、現在検討中です。手始めに表中のCY8CPROTO-063-BLEのメイン処理Cortex-M4コアへ、FreeRTOSを使ってLED点滅を行います。

と言っても、少し高価なCY8CKIT-062-BLEを使ったFreeRTOS LED点滅プログラムは、コチラの動画で紹介済みですので、詳細は動画をご覧ください。本稿は、CY8CPROTO-063-BLEと動画の差分を示します。

CY8CPROTO-063-BLE のCortex-M4とM0+のmain_cm4.c、main_cm0p.cとFreeRTOSConfig.hが下図です。

PSoC 6 CY8CPROTO-063-BLE FreeRTOS LED点滅のmain_cm4.cとmain_cm0.c
PSoC 6 CY8CPROTO-063-BLE FreeRTOS LED点滅のmain_cm4.cとmain_cm0.c
PSoC 6 CY8CPROTO-063-BLEのFreeRTOSConfig.h
PSoC 6 CY8CPROTO-063-BLEのFreeRTOSConfig.h

日本語コメント追記部分が、オリジナル動画と異なる箇所です。

RED LEDは、P6[3]ポートへ割付けました。M0+が起動後、main_cm0p.cのL18でM4システムを起動していることが判ります。これらの変更を加えると、動画利用時のワーニングが消えCY8CPROTO-063-BLE でFreeRTOS LED点滅動作を確認できます。

PSoCの優れた点は、コンポーネント単位でプログラミングができることです(コチラの関連投稿:PSoCプログラミング要点章を参照してください)。

PSoCコンポーネント単位プログラミング特徴を示すCreator起動時の図
PSoCコンポーネント単位プログラミング特徴を示すCreator起動時の図

PSoC Creator起動時の上図が示すように、Cypressが想定したアプリケーション開発に必要なコンポーネントの集合体が、MCUデバイスと言い換えれば解り易いでしょう。つまり、評価ボードやMCUデバイスが異なっても、使用コンポーネントが同じなら、本稿のように殆ど同じ制御プログラムが使えます。

PSoC 6 FreeRTOSテンプレートも、単に設定はこうです…ではなく、様々な情報のCY8CPROTO-063-BLE利用時ポイントを中心に、開発・資料化したいと考えています。PSoCプログラミングの特徴やノウハウを説明することで、ご購入者様がテンプレートの応用範囲を広げることができるからです。

MCUXpresso IDE 11.4.0 Release

MCUXpresso suite of software and tools
MCUXpresso suite of software and tools

2021年7月15日、NXPの統合開発環境MCUXpresso IDEが、11.3.1から11.4.0へ更新されました。
新たに追加されたAzure RTOS、弊社FreeRTOSアプリケーションテンプレートの新環境での動作確認を示します。

Azure RTOS追加

FreeRTOSに比べ未だ12個と少数ですが、LPCXpresso55S06などCortex-M33コアのAzure RTOS 対応評価ボードとSDK v2.10.0が追加されました。Microsoft AzureのAWS追随が、統合開発環境に現れました(関連投稿:多様化MCU RTOS)。

Azure RTOS Boards
Azure RTOS Boards

これに伴い、IDEのRTOSメニューにAzure RTOSの Message QueuesやSemaphoresなどのViewが追加されました。Azure RTOSデバッグユーザガイトは、MCUXpressoIDE_11.4.0_6224インストールフォルダ内にありますので参照してください。

RTOSメニューに追加のAzure RTOS View
RTOSメニューに追加のAzure RTOS View

FreeRTOSアプリケーションテンプレートの新環境動作確認

Config Toolsもv10.0へ更新されましたので、新IDE更新後、旧11.3.1開発プロジェクトのPinパースペクティブで再度Update Codeのクリックが必要です。Updateクリック後、Develop画面に戻り再ビルドします。(Config Toolsの使い方は、コチラの関連投稿を参照してください)。

MCUXpresso Config ToolsのUpdate Code
MCUXpresso Config ToolsのUpdate Code

再ビルドは正常に終了し、新MCUXpresso IDE 11.4.0とFreeRTOS対応評価ボードLPCXpresso54114で、FreeRTOSアプリケーションテンプレートの動作確認をしました。

FreeRTOSアプリケーションテンプレートと付属資料も、11.4.0対応版へ更新します。

新MCUXpresso IDE 11.4.0で旧プロジェクト動作確認。LPCXpresso54114のSDK更新はなし。
新MCUXpresso IDE 11.4.0で旧プロジェクト動作確認。LPCXpresso54114のSDK更新はなし。

補足1:新旧統合開発環境併存

NXPの統合開発環境は、PC上で新旧環境が同時併存可能です。

環境が併存しますのでストレージ容量は必要です。また、ターゲットボードのSDK改版が無くても再度新IDEへのインストールが必要など手間もかかりますが、新環境構築が安心してできます。但し、新環境下でターゲットプロジェクト開くと、新環境用に変更され旧環境に戻せません。

ターゲットプロジェクトは、新旧環境で別々にすることを忘れないでください。

補足2:STM版CMSIS-RTOSアプリケーションテンプレート構想状況

FreeRTOSやAzure RTOSなど開発者が対応すべきMCU RTOSは、今後増える傾向です。RTOSが変わっても同じ開発アプリケーションを活用・流用できるのがCMSIS-RTOSメリットです。STM版RTOSアプリケーションは、このCMSIS-RTOSを使って構想中で、この状況を示します(詳細は、STM32RTOS開発3注意点(後編)などを参照してください)。

FreeRTOSとCMSIS-RTOSのセマフォAPI比較
FreeRTOSとCMSIS-RTOSのセマフォAPI比較

上側がFreeRTOSセマフォ送受、下側がCMSIS-RTOSセマフォ送受ソースです。どちらも殆ど同じです。

IDEにContent Assist機能(Ctrl+Space表示のAPI候補一覧)があるので、ソース記述は簡単で、基本的なRTOS手段(上記はタスク同期セマフォ)を理解済みなら、FreeRTOSに比べ情報が少ないCMSIS-RTOS開発でも、当初思ったより障壁は低いと感じています。

CMSIS-RTOSメリット/デメリットを比較して、メリットの大きさを感じた今回のNXP IDE更新でした。STM版CMSIS-RTOSアプリケーションテンプレート構想は、近日中に投稿予定です。

STM32RTOS開発3注意点(後編)

STM32MCUでRTOS開発を行う時の3注意点、前編のSTM32CubeMX、HALに続き、本稿後編でCMSIS-RTOS関連を示します。

※木曜からの東京オリンピック4連休のため、通常金曜を本日水曜日に先行して投稿します。

前編は、STM32RTOS開発実例として、NUCLEO-G474RE FreeRTOS_QueuesサンプルプロジェクトのSTM32CubeMX(以下CubeMX)コード出力を使い、HALタイムベース変更の必要性を示しました。後編は、前編と同じ実例を使ってCMSIS-RTOSの注意点を示します。

FreeRTOS_Queues STM32CubeMXファイルのTasks and Queues

NUCLEO-G474RE FreeRTOS_QueuesサンプルプロジェクトのCubeMX構成ファイル:FreeRTOS_Queues.icoを開き、Middleware>FREERTOSのTasks and Queuesタブをクリックしたのが下図です。

FreeRTOS_QueuesのSTM32CubeMXファイルTasks and Queues
FreeRTOS_QueuesのSTM32CubeMXファイルTasks and Queues

2つのタスク:MessageQueuePro(Qプロデューサ:送信タスク)とMessageQueueCon(Qコンシューマ:受信タスク)と、1つのQ:osQueue(深さ1:ワード)を、CubeMXで自動生成するパラメタが設定済みです。関連投稿:NXP版FreeRTOSのQueueデータ送受信と同じです。

全て黒文字パラメタですので、変更も可能ですが、このままソースコードを自動生成(Alt+K)してください。

CMSIS-RTOS APIからFreeRTOS API変換(wrapper)

CMSIS-RTOS APIからFreeRTOS API変換
CMSIS-RTOS APIからFreeRTOS API変換

main.cのL125に、osQueueを生成するAPI:osMessageCreateが自動生成済みです。また、L134とL138に、MessageQueueProとMessageQueueConのタスク(Thread)を生成するAPI:osThreadCreateも自動生成済みなのが判ります。

ここで、API先頭にosが付くのは、CMSIS-RTOSのAPIだからです(L145のosKernelStartも同様)。詳細は、次章で説明します。

さて、L125のosMessageCreateへカーソル移動し、F3をクリックすると、cmsis-os.cのL1040へジャンプし、CMSIS-RTOS APIのosMessageCreateの中身が見えます。その中身が、L1055のxQueueCreateで、これはFreeRTOSのAPIです。

つまり、CubeMXが自動生成したのは、CMSIS-RTOS APIですが、その実体は、FreeRTOS APIであることが判ります。
この例のように、CubeMXが生成したCMSIS-RTOS APIは、cmsis_os.cで全てFreeRTOS APIへ変換されます。

CMSIS-RTOS

CMSIS-RTOSは、Cortex-Mコア開発元ARM社が定めたRTOS APIの規格です。
※CMSIS:Cortex Microcontroller Software Interface Standard

Cortex-Mコアには、FreeRTOS/Azure RTOS/mbed OSなど様々なRTOSが使えます。下層のRTOSが変わるとAPIも変わりますが、そのAPIを変換し、上層アプリケーションへ共通なRTOS APIを提供する、これにより、

  1. RTOSが異なっても、同じ開発アプリケーションが使えること
  2. Cortex-Mコアが異なっても、開発アプリケーション移植を容易にすること

これらがCMSIS-RTOSの目的です。

これをラップ(wrap=…を包む)と呼ぶことがあります。ラップ関数(wrapper)とは、下層API差を隠蔽し、上層アプリケーションへ同一APIを提供する関数のことです。STM32RTOS開発でのCubeMXの役目の1つは、使用するRTOSに応じたwrapperを提供することです。

現在、STM32RTOS開発のCubeMXがラップしているのは、FreeRTOSだけです。今後、FreeRTOSがAzure RTOSなどへ変わっても、開発アプリケーションをそのまま活用するために、今の時点からCMSIS-RTOS APIを使っている訳です。

Cortex-M0/M0+/M3/M4/M7コア向けの共通RTOS APIがCMSIS V1、Cortex-A5/A7/A9と全Cortex-Mコア向けの共通RTOS APIがCMSIS V2です。STM32RTOS開発では、CMSIS V1を用います。

CMSIS-RTOS とFreeRTOSのAPI

UM1722にCMSIS-RTOS APIとFreeRTOS APIの一覧が示されています。抜粋したのが下表です。

FreeRTOSとCMSIS-RTOSのAPI
FreeRTOSとCMSIS-RTOSのAPI

接頭語にx/vなどが付くのがFreeRTOS API、osが付くのがCMSIS-RTOS APIです。

CubeMXが生成するコードは、常にCMSIS-RTOS APIですが、実体はFreeRTOS APIです。FreeRTOSが別のRTOSへ変わっても、CMSIS-RTOS APIは同じです。CMSIS-RTOS APIとFreeRTOS APIのwrapper分のオーバーヘッドは生じますが、下層RTOSに依存しない点は、先進的で優れています。

なおUM1722 Rev3には、単にAPI列記とwrapper、RTOSサンプルプロジェクトの簡単な説明が記載されているだけです。

まとめ

STM32MCUでRTOS開発を行う時の3注意点(前編:STM32CubeMX、HAL)に続き、本稿後編で3つ目のCMSIS-RTOSを示しました。

STM32RTOS開発のSTM32CubeMXが扱うRTOSは、現在FreeRTOSだけです。FreeRTOSが別のRTOSへ変わっても、CubeMXは、開発アプリケーション流用性を高めるためにFreeRTOS APIの代わりにRTOS共通CMSIS-RTOS APIを出力します。

CMSIS-RTOS APIには、Cortex-M0/M0+/M3/M4/M7コア間で開発アプリケーション移植性が高いCMSIS V1を使います。

CMSIS-RTOS API変換オーバーヘッドがありますが、流用性、移植性に優れたRTOSアプリケーション開発ができる点は、優れています。

あとがき

残念ながらCMSIS-RTOS情報は、シェア1位AWSのFreeRTOSに比べ少なく、この少ない情報を使ってSTM32RTOS開発を行うのは、大変です。
※2位がAzureのAzure RTOS、3位がGCP(Google Cloud Platform)のmbed OS。関連投稿はコチラ

例えば、最初の図:CubeMXのTasks and QueuesのGUI設定パラメタが多いにもかかわらず、UM1722サンプルプロジェクト説明が少ない点などです。

RTOSは、複数タスク(CMSIS-RTOSではThread)間の優先順位差とRTOS自身の動作により、開発タスク処理状態が変わります。ベアメタル視点に加え、RTOS視点でのタスク開発と経験が求められます。QueueなどRTOS単独手段理解が目的のサンプルプロジェクトだけでは、RTOS開発経験は積めません。

弊社はこれらの対策として、効率的なRTOS基礎固め、STM32RTOSアプリケーションのプロトタイプ開発早期着手を目的としたSTM版RTOSアプリケーションテンプレート(仮名)を検討中です。その構想は、固まり次第、別稿にて示す予定です。

なお、NXP版FreeRTOSアプリケーションテンプレートは、コチラで販売中です。

多様化MCU RTOS対策

IoT MCUクラウド市場は、AWSとMicrosoft Azureがリードしており世界収益の半分以上を占めるという記事に掲載されたのが下図です(EE Times 2021年6月7日、横軸:市場シェア、縦軸:年平均成長率)。Microsoftは徐々にAmazonに迫っており、市場シェア差は、過去1年で2ポイント縮まったそうです。

クラウトプロバイダの市場シェア(出典:記事)
クラウトプロバイダの市場シェア(出典:記事)

多様化MCU RTOS

AWSへの接続にはAmazon FreeRTOS、Microsoft AzureにはAzure RTOSを用います。IoTクラウド接続ウェビナーでは、どのMCUベンダでも先行しているAmazon FreeRTOSを使った接続例が主流です。しかし、最近は、Azure RTOS利用の接続資料やウェビナーも見られます。AWSとMicrosoft Azureの差が縮まりつつある証左でしょう。

また、第3勢力として急成長中のGoogleクラウド接続にはARM mbed OSが使われます。IoT MCUに実装するRTOSは多様化してきました。

IoT MCU RTOSとPCブラウザ

IoT MCU RTOSとPCブラウザ比較
IoT MCU RTOSとPCブラウザ比較

この状況は、PCブラウザが現状、複数共存しているのに似ています。

機能的には同じブラウザですが、表示/印刷/広告などの使い勝手が少しずつ異なるため、必要に応じて複数ブラウザを使い分ける方も多いでしょう。記憶容量の大きいPCでは、ブラウザ併用・共存も簡単です。

しかし、限られた容量しか持たないMCUの場合は、複数RTOSの中からMCU搭載RTOSは1つに絞られると思います。

例えば、AmazonやMicrosoft、Google各社の強み(販売/文書/広告)や特徴を活かし、IoT機器制御サービスやAI活用サービスなど魅力的クラウドサービスを各社各様で提供し、その価格、顧客との結びつきの強さなどがサービス選択の決め手となるでしょう。

いずれにせよ顧客が、利用するクラウドサービスを決め、その接続手段として各社RTOS接続ライブラリの使用、加えてRTOS環境での上層MCUソフトウェア開発を行うことになります。

問題は、RTOS環境のMCUソフトウェア開発手法がベアメタルと異なること、各社RTOS仕様が少しずつ異なることです。

多様化RTOS対策

仮に、Cortex-M4/M0+ディアルコアMCUで、クラウド通信処理全てを、Cortex-M0+コア側のRTOSライブラリで行い、通信とアプリケーションが完全分離された構成であれば、問題は解決します。接続サービス毎にRTOS通信ライブラリを変えさえすれば、対応できるからです。

BluetoothやThreadなど複数無線通信規格から1つを選んで処理するなど、この構成に近いベアメタルソフトウェア対応のMCUが既にあります。

しかし、主流ウェビナーで用いられる高性能Cortex-M4シングルコアを使って、クラウド通信とアプリケーションの両方を処理する場合には、接続先のクラウドに応じて「FreeRTOS/Azure RTOS/Mbed OSなど様々なRTOS環境の上層アプリケーション開発」になります。

RTOSの目的は、MCUハードウェア隠蔽と開発ソフトウェア流用性向上なのに、複数RTOS存在で開発アプリケーションが異なるとは、皮肉な結果です。

最初の図は、IoT MCU開発者が、今後急増するクラウド接続IoT MCU開発に、これら複数RTOSを効率的に習得し、かつ、顧客が選ぶ1個のRTOSアプリケーションを早期に開発できるスキルを獲得しなければならない現状や将来を示しているとも言えます。

こういう状況での常套手段は、共通部分と個別部分の分離、共通部分からの段階的習得です。

どのRTOSでもSemaphoreやQueueは、ほぼ共通の基本機能です。先ずは、この2機能をしっかり把握し、より高度なミューテックスやイベントグループなどRTOS毎に特徴があり機能も異なる対象へ発展するのが効率的でしょう。

※RTOSは、複数タスク(AzureはThread)を、優先順位に応じてリアルタイムに実行/待機/状態保存復帰の切替えを行います。タスク間同期手段がSemaphore、データ送受手段がQueueで、この2つはどのRTOSでも共通の基本機能です。

まとめ

IoT MCUクラウド市場シェアから、クラウド接続IoT MCU RTOSもPCブラウザ同様、様々な仕様併存の可能性があります。

顧客が選ぶRTOSに柔軟対応し、そのRTOS上層の様々なRTOSアプリケーションを早期開発するには、先ず、各RTOS共通機能のSemaphoreとQueueを把握し、より高度でRTOS毎に異なる個別機能へ発展する習得アプローチが効率的です。

6Eリリース予定の弊社FreeRTOSアプリケーションテンプレート(税込2000円)は、主流のAmazon FreeRTOSを用い、NXP)LPCXpresso54114(Cortex-M4/150MHz、Flash/256KB、RAM/192KB)にて動作確認済みです。

添付するRTOSプロジェクトは、各RTOS共通機能SemaphoreとQueueを利用しており、上記習得アプローチを満たすツールとして、また、全ての物をつなげる主役IoT MCU RTOS基礎固めに最適です。