組込み開発 基本のキ: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同様、英語の方が使いやすいと筆者は感じました。

Bluetooth 5.3 LE対応RA開発中

Bluetooth 5.3対応の開発中RA MCU
Bluetooth 5.3対応の開発中RA MCU

2021年10月21日、ルネサスは、最新規格Bluetooth 5.3 Low Energy(LE)対応のRAファミリ新MCUを開発中と発表しました。RA搭載予定のBluetooth 5.3 LE機能と、ルネサス32ビットMCU におけるRAファミリの位置づけを示します。

搭載予定の最新Bluetooth 5.3 LE機能

PCとキーボード、スマホとヘッドホン間など近距離低消費電力無線通信規格としてBluetooth 5は、広く用いられています。MCU搭載例も多く、本ブログでも何件か投稿してきました(STマイクロのSTM32WB、Cypress/InfineonのPSoC6、NXPのKW41Z、Bluetooth 5規格)。

RAファミリでもBluetooth 5対応RA4W1が発売中です。開発中のRAは、新規格Bluetooth 5.3対応MCUです。

Bluetooth SIGが2021年7月13日に発表した新規格Bluetooth 5.3は、Bluetooth 5に、スループットと信頼性、エネルギー効率向上など様々な機能を追加しました。詳細は、Bluetooth SIG サイトのBluetooth Core Specification v5.3で判ります。

開発中の新RAには、これらBluetooth 5.3機能に加え、Bluetooth 5.1で追加された方向検知機能、Bluetooth 5.2で追加されたステレオオーディオ伝送用アイソクロナスチャネルも対応予定です。また、ソフトウェア無線(SDR)機能の搭載により、後日リリースされる新たな規格への移行も可能だそうです。

つまり、新RAは、Bluetooth 5以降の新Bluetooth機能満載のIoT MCUで、しかも、SDRにより新しい機能追加も可能な、“万能”近距離低消費電力無線通信付きIoT MCUになりそうです。

2022年1~3月サンプル出荷予定

最新規格Bluetooth 5.3 Low Energy対応、開発中RA MCUのサンプル出荷は、2022年第1四半期(1~3月)が予定されています。

RAファミリ位置づけ

独自コア、ARMコア、開発環境など様々なルネサス32ビットMCUファミリ差が一目で判る図が、コチラの記事にあります。

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

IoT MCU開発者の立場からRAファミリを分析すると、

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

などRXファミリやSynergyでは不可能であった、手軽で低コスト、個人レベルでも開発可能な32ビットIoT MCUと言えます。

RAファミリ向けルネサスEcosystemは、Eclipse IDEベースのe2 studioです。また、RAファミリ専用Flexible Software Package(FSP)によるAPI生成ツールは、ピン互換性、周辺回路共通性があるため、RAファミリ内での開発ソフトウェア移行や移植も容易になる特徴があります。

無償GNUコンパイラのFlash容量制限などもありません。

RAファミリ開発方法

開発中のBluetooth 5.3 LEが新たに周辺回路に追加されますが、e2 studioやFSPによるRAファミリ開発方法は、汎用RA MCUのRA4E1 Fast Prototype Boardの使い方や、FreeRTOSの使い方と同じです。

RAファミリ開発の早期着手、習得したい方は、上記リンクを参考にしてください。

Flexible Software Package v3.4.0更新

FSPは、10月7日にv3.4.0へバージョンアップしました。

e2 studio 2021-10のHelp>check updatesではFSP v3.3.0から自動更新しません。FSPサイトから最新v3.4.0をダウンロードし、手動でアップグレート更新する必要があります。

Flexible Software Packageのアップグレード
Flexible Software Packageのアップグレード

v3.4.0を別の場所にインストールすれば、旧v3.3.0との併存も可能です。

RA4E1 Fast Prototype BoardのFreeRTOS使い方

RA4E1 Fast Prototype BoardへFreeRTOSを適用
RA4E1 Fast Prototype BoardへFreeRTOSを適用

RAファミリ評価ボードRA4E1 Fast Prototype Board (Cortex-M33/100MHz、Flash/512KB、RAM/128KB)(以降FPB)の、スイッチS1でLED2を点灯するFreeRTOS適用例を示します。RAファミリビギナーズガイド9章記載のEK-RA6M4評価キットを使った処理内容と同じです。

e2 studio 2021-10は、Project>Change Deviceで対象MCUデバイス変更機能がありますが動作しません。そこで、ガイド掲載のEK-RA6M4を手動でRA4E1へ変更し、FPBでFreeRTOSのセマフォを利用し、S1押下げ割込みとLED2トグル点灯を同期させるFreeRTOSサンプルコードを示します。

このコードを使い、前稿よりも具体的にFPBとFlexible Software Package(以降FSP)の使い方、今回は使わないTrustZoneのメリットを示すのが、本稿の目的です。

RA4E1 Fast Prototype Board(FPB)のRTOSとTrustZone

IoT MCUをクラウド接続するには、RTOSが必要です。AWS(Amazon Web Services )接続にはFreeRTOSライブラリ、Microsoft Azure接続にはAzure RTOSライブラリの利用が前提だからです。

また、クラウド接続には、TrustZoneなどハードウェアによるセキュリティ対策も要求されますので、RTOSとTrustZoneは、IoT MCUの必須2技術です。

ハードウエアセキュリティは、開発後、簡単に追加することが困難です。今回はTrustZone未使用ですが、IoTプロトタイプ開発にTrustZone内蔵Cortex-M33を用いるのは、例え未使用でも製品セキュリティ処理の具体的検討ができるなど、IoTセキュリティを開発初期から考慮した設計となるからです。

これが使わないTrustZoneのメリットです(TrustZone使用例も、いずれ投稿予定)。

本稿は、先ずFreeRTOSをFPBへ適用します。FreeRTOS新規プロジェクト作成、API生成ツールFSP設定、FSP生成ファイルへのタスク追記の順に説明します。

Step1:FreeRTOS新規プロジェクト作成

最新版e2 studio(2021-10)の新規FreeRTOSプロジェクトは、File>New>C/C++Projectとクリックし、①~⑥の手順で作成します。

FreeRTOS新規プロジェクト作成
FreeRTOS新規プロジェクト作成

②プロジェクト名は、任意です。③Boardは、PFB-RA4E1を選択します。

④TrustZone未使用時のプロジェクトを、“Flat”と呼びます。これは、TrustZone使用時、セキュアと非セキュアの2プロジェクト並存が必要となりメモリ領域を分割することに対する、平坦なメモリ使い方に起因していると思います。

※メモリ領域分割は、PCハードディスクのパーティション分割をイメージして頂ければ判り易いでしょう。例えサイバー攻撃を受けても、物理的に侵入できないメモリ領域を作り、ここへ最重要情報やソフトウェアを保存する訳です。

⑤FreeRTOSを選択します。ベアメタル(No RTOS)とAzure RTOSも選択可能です。⑥Minimalを選択し、FinishクリックでFreeRTOS(TrustZone未使用)新規プロジェクトが完成です。

各選択肢を変えると、前稿で説明した多種類の新規プロジェクトが作成できることが解ります。

Step2:Flexible Software Package(FSP)設定

Flexible Software Package (FSP)設定
Flexible Software Package (FSP)設定

新規プロジェクト作成のFinishクリックで、FSPパースペクティブオープンを聞いてきますので、開きます。

①プロジェクトSummaryが表示されます。Stacksタブを選択、②New Stackをクリックし、External IRQ Driver on r_icuを選択します。新しい外部割込みドライバがStackに追加され、③プロパティが表示されます。

FPBのユーザスイッチS1は、P205(IRQ1)に接続済みです。そこで、③プロパティのirq0をirq1、TriggerをFalling、Digital FilteringをEnable、Callbackをexternal_irq1_callbackに変更します。

次にセマフォ追加のため、④ObjectsのNew Objectsをクリックし、Binary Semaphoreを選択します。⑤プロパティSymbolをg_s1_semaphoreに変更します。

RA4E1 Fast Prototype BoardのSW1 P205(IRQ1)の確認
RA4E1 Fast Prototype BoardのSW1 P205(IRQ1)の確認

最後に、⑥pinsタブをクリックし、ユーザスイッチS1:P205(IRQ1)とIOピン割当てをGUIで確認します。

以上でFSP設定は完了です。Generate Project Contentをクリックすると、APIや割込みコールバック関数、関連ファイルが自動生成されます。

Step3:FSP生成ファイルへタスク追記

FreeRTOSセマフォ同期処理
FreeRTOSセマフォ同期処理

FSPが生成したファイル:led_thread_entry.cに上記コードを追加します。このコードは、LED初期化と無限ループ処理から構成されます。RAビギナーズガイド掲載のirq10をirq1へ変更したLEDタスクです。

コールバック関数external_irq1_callbackは、Developer AssistanceのLED Threadを開くと一番下に割込みコールバック関数が生成済みですので、これをドラッグ&ドロップして追加します。

LEDタスク追加後、ビルドしFSBへダウンロード、デバッガ起動後、再開を2回クリックして実行中の様子が上図です。FSBのS1クリックでLED2がトグル点灯します。

FreeRTOS Queueサンプルコード

前章は、RAファミリビギナーズガイド9章のEK-RA6M4評価キットFreeRTOSセマフォサンプルコードを、RA4E1 Fast Prototype Board(FPB)へ流用したコードです。変更箇所は、irq10をirq1へ変えただけです。

FSPには、FreeRTOS Queueサンプルコード:freertos_fpb_ra4e1_epも付属しています。これら2つのサンプルコードを理解すれば、セマフォとQueueを使う基本的なFreeRTOSソフトウェア開発が可能です。

FreeRTOS待合せ手段としては、セマフォ/Queue以外にもMutexやイベントグループなどの手段もあります。弊社ではFreeRTOS基礎固めを目的として、Hardware Independent FreeRTOS Exampleを応用したセマフォ/Queue活用のFreeRTOSテンプレート化を目指しています。RA/REテンプレートもこの方針で開発する予定です。

この方針で開発したNXP版FreeRTOSアプリケーションテンプレートは、コチラから概要がダウンロード可能です。

まとめ

RA4E1 Fast Prototype Board(FPB)へ、RAファミリビギナーズガイド掲載FreeRTOSサンプルコードを流用し、ユーザスイッチS1とLED2点灯をセマフォで同期させました。

FreeRTOS新規プロジェクト作成、Flexible Software Package(FSP)設定、FSP生成ファイルへのタスク追記の具体的操作手順を示しました。

ガイド9章には、更に詳細な説明がありますので、参考になります。例えば、スイッチ割込み優先度12を利用する理由、systick優先度15が予約済みであるなどです。

TrustZoneは未使用ですが、プロトタイプ開発初期からIoTセキュリティを考慮した設計ができるメリットがあります。

FSP付属Queueサンプルコードと本セマフォコードを使ってFreeRTOS基礎固め目的のRA/REテンプレート開発を進めます。

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プログラミングの特徴やノウハウを説明することで、ご購入者様がテンプレートの応用範囲を広げることができるからです。

STM版CMSIS-RTOSアプリケーションテンプレート構想

販売中のNXP版FreeRTOSアプリケーションテンプレートに続いて、STマイクロエレクトロニクス版CMSIS-RTOSアプリケーションテンプレート構想を示します。

IoT MCU開発者にRTOS開発経験とスキルが必須であること、短期で効率的にRTOSスキルを磨けるSTマイクロエレクトロニクス版CMSIS-RTOSアプリケーションテンプレート構想を示し、汎用性、セキュリティ、広い流用性を持つSTM32G4をターゲットMCUにした理由を示します。

IoT MCU開発者スキル

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

IoT MCU開発者は、ベアメタルMCU開発スキルの上に、FreeRTOSやAzure RTOSなど接続するクラウドに応じたRTOSスキルが必要です。クラウド接続後、顧客要求のIoTサービスを実装しますが、実装時には、競合他社より早い開発スピードなどの差別化スキルも要求されます。

更に、IoTセキュリティや、より高性能なデュアルコアMCUへの流用、顧客横展開など、発展性への配慮も必要です。これらは、図示したようにベアメタルMCU開発スキルを基礎とする階層構造です。
※スキルとは、開発経験に基づいた手腕、技量のことです。

RTOS開発経験とスキル

全てのモノをネットワークへ繋ぐ時代は、従来のMCUからIoT MCUへの変革が必要です。IoT MCU開発者にとってRTOS開発経験とスキルは、近い将来必須になります。理由が下記です。

・RTOSライブラリ利用がクラウド接続に必須  👉①IoT MCU急増への備え
・大規模MCU開発にRTOSが便利(≒必須)   👉②開発規模拡大への備え
・ベアメタル開発よりもRTOS開発が効率的   👉③ソフトウェア資産への備え(補足参照)

つまり、過去何度も提言されたMCUソフトウェア資産化・部品化を、RTOSが実現するからです。逆に、IoT MCU開発では、このソフトウェア資産化・部品化(ライブラリ活用)無しには、実現できない規模・技術背景になります。
※例えば、IoTセキュリティだけでも専門家が対応すべき領域・規模・技術背景になりそうです。

IoT MCU開発の成功には、様々な専門家技術が活用できる土台のRTOSは必須です。IoT MCU開発専門家の一員となるには、RTOS開発経験とスキルは必須と言えるでしょう。

効率的RTOSスキル習得

ベアメタル開発経験者の効率的なRTOS基礎固め、スキル取得を弊社STM版CMSIS-RTOSアプリケーションテンプレートの目的とします。

この目的は、NXP版FreeRTOSアプリケーションテンプレートと同じです。違いは、NXP版がFreeRTOSを用い、STM版は、コード生成ツール:STM32CubeMXが出力するCMSIS-RTOSを用いる点です。

現時点のSTM版CMSIS-RTOS APIは、FreeRTOS APIをラップ(wrapper)したもので、中身はFreeRTOSそのものです。※CMSIS-RTOS詳細は、コチラの関連投稿を参照してください。

ベアメタル開発経験者のRTOS基礎固め・スキル獲得を、短期・効果的に達成するには、

・基本的RTOS待ち手段(タスク同期:セマフォとタスク間通信:Queue)理解
・RTOSプロトタイプ開発にも使える弊社テンプレートプロジェクト活用

が適しています。

既に持っているベアメタル開発経験を活かし、例えば、単独RTOSサンプルプロジェクトでは得られない複数タスク優先順位を変えた時の各タスク挙動や、RTOSセマフォ送受失敗時の挙動などスキルアップに役立つ事柄を、自ら評価・判断できるからです。この評価を助けるために、同じ動作のベアメタルプロジェクトもテンプレートに添付します。

効率的にRTOS開発スキルを習得する方法として、自己のベアメタル開発経験を使ってRTOS習得・スキルアップする本手法は、Betterな方法だと思います。

コチラにFreeRTOS習得に役立つ情報をまとめています。ポイントとなる点をざっと掴んで、実際の開発環境で試し、参考書やマニュアルなどの内容を開発者自ら考える、これにより新技術やスキルを、身に付けることができると思います。

STM版CMSIS-RTOSアプリケーションテンプレート構想

STM版CMSIS-RTOSアプリケーションテンプレートも、NXP版同様、同一動作のベアメタルプロジェクトを添付します。

RTOS/ベアメタルどちらのプロジェクトも、ADC入力、LCD出力、SWチャタリング対策入力、LED出力、VCOM入出力の動作確認済みで、プロトタイプ開発着手時のスタートプロジェクトとしても利用可能です。

付属説明資料には、ベアメタル視点からのCMSIS-RTOS説明を加えます。また、テンプレート利用CMSIS-RTOS APIとFreeRTOS APIの対応表も添付する予定です。

CMSIS-RTOSアプリケーションテンプレートをご購入後、ベアメタル開発経験者が、RTOSプロジェクトとベアメタルプロジェクトの比較・評価がスグに始められる構成です。※比較・評価は、ご購入者ご自身で行ってください。

STM32メインストリームMCU比較(出展:STマイクロエレクトロニクスに加筆)
STM32メインストリームMCU比較(出展:STマイクロエレクトロニクスに加筆)

CMSIS-RTOSアプリケーションテンプレート動作環境は、メインストリームMCUのSTM32G4評価ボード:NUCLEO-G474RE(Cortex-M4/170MHz、Flash/512KB、RAM/96KB)とHAL APIを用います。

STM32G4は、高性能で汎用性とIoT MCU基本的セキュティ機能を備え、RTOSテンプレートのターゲットIoT MCUとして最適です。

STM32G4のセキュリティ機能を示したのが下図です。

STM32G0とG4のセキュリティ対応(出展:STM32 Security対応表に加筆)
STM32G0とG4のセキュリティ対応(出展:STM32 Security対応表に加筆)

また、STM32G4の汎用性、他MCUへの開発ソフトウェア流用性の広さを示したのが下図です(詳細は、コチラの関連投稿3章を参照してください)。

NUCLEO-G474RE搭載のSTM32G474RETx Compatible MCU List。2021年8月時点で98MCU!
NUCLEO-G474RE搭載のSTM32G474RETx Compatible MCU List。2021年8月時点で98MCU!

NUCLEO-G474RE評価ボードの他には、ArduinoプロトタイプシールドとBaseboardを用います。

つまり、販売中のNXP版FreeRTOSアプリケーションテンプレート評価ボード:LPCXpresso54114が、STマイクロエレクトロニクスNUCLEO-G474REにのみ変化した構成です。

CMSIS-RTOS動作もNXP版と同様、Hardware Independent FreeRTOS Exampleを基としますので、(両テンプレートをご購入頂ければ)STMとNXPのRTOSアプリケーション開発の直接比較なども可能です。

STM版CMSIS-RTOSアプリケーションテンプレートのリリースは、今秋のWindows 10 21H2更新後(Windows 11リリース後かも?)を予定しております。時間的に少し余裕がありますので、Cypress版PSoC 6ディアルコア対応FreeRTOSアプリケーションテンプレートも同時リリースできればBestだと考えています。

補足:③ソフトウェア資産への備え

ベアメタル開発でもソフトウェア規模が大きくなると、開発者が悩む点は、複数処理の待ち合わせ/制御順序です。対策は、処理を細かく分割し、優先度を考慮しつつ順次処理を行うのが常套手段です。

ところが、RTOSを使うと、この面倒な待ち処理や制御順序を、RTOSがタスク優先順位に応じて処理します。しかも、処理分割も、RTOSがTICK_RATE_HZ単位で勝手(!?)に行ってくれます😀。

RTOSにより、タスク数やTICK_RATE_HZ、最大優先順位に応じたスタックを大量に利用しますのでRAM使用量の増加、RTOS自身のオーバーヘッドなど副作用も生じますが、「タスク記述は、超簡単」になります。

初期設定と無限ループ、ループ内のRTOS待ち手段、優先順位を検討すれば、文字通り単一処理タスクを開発し、マルチタスク化はRTOSに任せます。

※ベアメタル開発経験者は、セマフォ、Queue、Mutex、イベントグループなどのRTOS待ち手段を、上記実現のためのAPIと捉えると、RTOS理解が早くなります。
※上記手法を使うと、ベアメタルサンプルプログラムもそのままRTOSへ組込めます。
※最も難しそうなのが優先順位検討ですが、ソース上で簡単に変更できます。
※RTOSマルチタスク処理を100%信頼した上での筆者感想です。

Cortex-M4コアでRTOSが使えMCUのFlash/RAMに余裕があれば、ベアメタル開発よりもRTOS開発の方が効率的に開発できると思います。また、この環境で開発したソフトウェアは、資産として別のRTOS開発へも使えるので個人ソフトウェア資産化も可能です。

上記は、RTOSの筆者感想です。弊社RTOSアプリケーションテンプレートをご購入頂き、各開発者でRTOSに対する独自感想を抱き、短期で効率的にRTOS開発経験とスキルを磨いて頂ければ幸いです。

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アプリケーションテンプレートは、コチラで販売中です。

STM32RTOS開発3注意点(前編)

STマイクロエレクトロニクス)STM32MCUを使ってRTOS開発時のSTM32CubeMX、HAL、CMSIS RTOSの3注意点について示します。前編が、STM32CubeMXとHALについてです。CMSIS RTOSは、別途後編で示します。

STM32CubeMXとHAL の注意点を解説した後、サンプルプロジェクトで実例を示すという順番で説明します。

ソースコード生成ツール:STM32CubeMX

STマイクロのソースコード生成ツール:STM32CubeMX(以下CubeMX)は、MCU内蔵周辺回路の初期設定やAPIを、GUIベースで自動生成する非常に便利なツールです。

※MCUベンダのAPI生成ツールを比較した関連投稿は、コチラをご覧ください。

CubeMX生成APIは、ハードウェアを抽象化し、STM32MCU間で最大限の高いソフトウェア移植性を狙ったHAL (Hardware Abstraction Layer)と、よりハードウェアに近くHALよりも高速・軽量なエキスパート向けLL(Low-layer)の2種類から選択可能です。

HALとLL比較(出典:STM32 Embedded Software Overvire)
HALとLL比較(※説明のため着色しています。出典:STM32 Embedded Software Overvire)

一般的に、HAL APIが好まれます。というのは、このLL APIを利用し開発した2019年6月発売のSTM32G0xテンプレートV1の売上げはゼロでした。対策に、LL APIからHAL APIに変更し再開発した2020年6月発売のSTM32G0xテンプレートV2は、人気があるからです。

これらCubeMXの各種GUI設定や選択APIは、CubeMXファイル(.ico)に構成ファイルとして纏められます。

STM32MCU新規プロジェクト開発時に、この既成CubeMXファイル(.ico)を利用すると、ゼロから着手するのに比べ、効率的かつ間違いなく周辺回路や初期設定ができるため、利用価値の高いファイルです。

特に、ベアメタル比、さらに多くのCubeMX設定が必要となるRTOS開発では、既成CubeMXファイルを再利用するメリットがより高まります。同時に、生成コードの意味も理解しておく必要があります。

HALタイムベース

HALには、他ベンダにない便利なAPI:HAL_Delayがあります。

例えば、10msの待ち処理を行う場合、他ベンダなら、MCUコア速度に応じて適当にループ回数を調整したループ処理で10ms相当の遅延を自作します。しかし、HAL APIならば、HAL_Delay(10)の記述だけで、MCUコア速度に依存しない正確な10ms遅延が実現できます。

これは、HAL自身が、MCU内蔵タイマ:SysTickの利用を前提に設計されているからです。遅延処理を例に説明しましたが、STM32のHAL APIsは、SysTickと強く結びついています。

もちろん、HAL APIをベアメタル開発で利用する場合は、この結びつきに何ら問題はありません。

RTOSタイムベース

FreeRTOSも、タスク(スレッド)状態遷移タイムベースに、SysTickを使います。

これは、FreeRTOSだけでなく他のRTOSでも同じです。SysTickは、その名称が示すようにMCUシステムレベルのタイムベース専用タイマです。

従って、STM32MCUでRTOS開発を行い、かつHAL APIを利用する場合には、RTOS側でSysTickを使うのが、名称に基づいた本来の使い方です。

HALタイムベース変更

そこで、STM32RTOS開発でHAL利用の場合は、HALのタイムベースを、デフォルト使用のSysTickから別のタイマへ変更する必要が生じます。この変更に伴う手動設定も当然必要となります。

*  *  *

ここまでが、STM32RTOS開発におけるSTM32CubeMXとHALに関する注意点です。
これらの注意点が解っていると、次章で示すRTOSサンプルプロジェクトのCubeMXファイルの意味と生成コードが理解できます。

STM32RTOS開発実例

STM32RTOS開発実例に、評価ボード:NUCLEO-G474RE(Cortex-M4/170MHz、Flash/512KB、RAM/96KB)でRTOS開発する場合を示します。

NUCLEO-G071RB(Cortex-M0+/64MHz、Flash/128KB、RAM/32KB)でRTOS開発する時でも同様です。しかも、RTOSサンプルプロジェクトは、STM32G071RBの方が(発売が古いためか?)多いので、NUCLEO-G071RBをお持ちの方は、是非ご自身で試してみてください。

FreeRTOS Example Selector

STM32CubeIDEのFile>STM32 Projectで、新規プロジェクト作成パネルを表示します(最新情報更新のため、表示に少し時間がかかる場合があります)。Example Selectorタブを選択、Middleware>FreeRTOSにチェックを入れ、NUCLEO-G474REのFreeRTOS_Queuesを選択したのが下図です。

NUCLEO-G474REのFreeRTOS_Queues
NUCLEO-G474REのFreeRTOS_Queues

右上欄、Noteの内容が、前半までに示した注意点のことです。参照先UM1722 Rev3は、CMSIS RTOSとFreeRTOSの関係があるのみです。このCMSIS RTOSについては、別途後編で説明します。

Nextをクリックし、FreeRTOS_Queuesサンプルプロジェクトを新規作成します。

さて、FreeRTOS Examples Listが318アイテム(STM32CubeIDE v1.6.1時)もあるので、Exportをクリックし、出力されたExcelファイルをBoardでフィルタリング、NUCLEO-G071RBとNUCLEO-G474REを抽出したのが下図です。

FreeRTOS Example List
FreeRTOS Example List

緑に色付けしたNUCLEO-G071RBの方が、FreeRTOSサンプルプロジェクト数が多いことが判ります。開発予定のSTM版FreeRTOSアプリケーションテンプレートは、Cortex-M4コアが対象ですので、本稿ではNUCLEO-G474REのFreeRTOS_Queuesを実例として使いました。

FreeRTOS_QueuesのSTM32CubeMXファイル

FreeRTOS_QueuesサンプルプロジェクトのCubeMX構成ファイル:FreeRTOS_Queues.icoが下図です。グレー文字は変更不可、黒文字は変更可能を示します。

FreeRTOS_Queues.ico
FreeRTOS_Queues.ico

TIM6がグレーなのは、HALタイムベース変更先がTIM6だからです。Kernel settings CPU CLOCK HZのSystemCoreClockがグレーなのは、RTOSタイムベースがSysTickだからです。つまり、本来の名称に基づいたSysTickがRTOS側で使われ、HALの新タイムベースにTIM6が割当済みであることが解ります。

FreeRTOS APIは、変更不可のグレーCMSIS V1です。ここは、後編で説明します。

デフォルトDisabledのUSE IDEL HOOKを、Enabledに変更し、ソースコード自動生成のGenerate Code(Alt+K)を実行してください。

HALタイムベースTIM6変更結果

FreeRTOS_QueseのTIM6とHook関数
FreeRTOS_QueseのTIM6とHook関数

app_freertos.cのL62に、Hook関数:vApplicationIdleHoolのひな型が自動生成済みです。ここへWFIを追記すれば、FreeRTOSアイドル時に低電力動作ができます。コチラのNXP版関連投稿Step5: FreeRTOS低電力動作追記と同じです。

main.cのL289は、TIM6満了時動作です。HAL_IncTick()が自動生成済みです。ベアメタル開発のSysTickからTIM6へHALタイムベースが変更されたことが解ります。

そのTIM6は、stm32g4xx_hal_timebase_tim.cで、1MHz=1ms満了に初期設定済みです。

つまり、STM32RTOS開発でHAL利用時に必要となる変更が、「全てCubeMXで自動生成済み」なのが解ります。

※上図は、USE_TICK_HOOKもEnabledへ変更した例です。Disabledへ戻すなどして、CubeMX自動生成ファイルが変化することを確かめてください。

この実例のように、CubeMX付属RTOSサンプルプロジェクトのCubeMXファイル(*.ico)を再利用すれば、周辺回路や初期設定ミスを防ぎ、RTOS新規アプリケーション開発が容易になることが解ります。

まとめ

STM32MCUでRTOS開発を行う時の3注意点、STM32CubeMX、HAL、CMSIS RTOSのうち、前編としてSTM32CubeMX、HALの2注意点とサンプルプロジェクトを使ってその実例を示しました。

RTOS開発では、既成STM32CubeMXファイル再利用価値が高まること、HALタイムベース変更の必要性がご理解頂けたと思います。3つ目のCMSIS RTOS関連は後編で示します。

あとがき

ベアメタル開発経験者であっても、STM32RTOS開発時、CubeMXのNoteを読むだけで、ベアメタル開発では何の問題も無かったHAL タイムベース変更理由が解り、その結果生じるCubeMXファイルや自動生成ソースコードの中身が理解できる方は、少ないと思います。本稿は、この変更理由と生成コードに説明を加えました。

STM32CubeMXは、STM32MCU開発に必須で強力なAPI生成ツールです。が、時々、説明不足を感じます。問題は、どのレベル読者を相手にするかです。エキスパートなら説明不要ですが、初心者ならゼロから説明しても解らないかもしれません。文章による組込み技術説明が、難しいのが根本原因でしょう😂。

そんな組込み開発ですが、文章だけでなく、「実際に評価ボードと手足を使って慣れてくると、案外すんなり簡単に理解、習得できる方が多いのも組込み開発」です。

販売中のNXP版FreeRTOSアプリケーションテンプレートにも、本稿同様、詳しいFreeRTOS解説を付けています(一部ダウンロード可能)。FreeRTOS開発を手軽に試せ、習得を支援するツールです。

FreeRTOSアプリケーションテンプレート発売

FreeRTOSアプリケーションテンプレート動作中
FreeRTOSアプリケーションテンプレート動作中

ARM Cortex-M4コア動作のFreeRTOSアプリケーションテンプレート第一弾、NXP)LPCXpresso54114対応版(税込2000円)を本日より発売します。概要、要点、FreeRTOSアプリケーションテンプレートとは、に関する説明資料は、コチラから無料ダウンロードできますのでご覧ください。

開発背景

IoT MCUのクラウド接続には、AWSならAmazon FreeRTOS、Microsoft AzureならAzure RTOSなどのRTOSが必要です。クラウド側からは、1つのRTOSライブラリを使って様々なMCUハードウェアを接続するための手段、これがRTOSです。

一方、IoT MCU側からは、接続先サービスに応じたRTOSライブラリ利用に加え、従来のベアメタル開発からRTOS上でのアプリケーション開発へ発展する必要もあります。IoT化に伴うこのような変化に対し、開発者個人が手間なく対応するためのツール、これが弊社FreeRTOSアプリケーションテンプレートです。

MCU RTOS多様化対策のFreeRTOSアプリケーションテンプレート
MCU RTOS多様化対策のFreeRTOSアプリケーションテンプレート

目的

FreeRTOSアプリケーションテンプレートの目的は、「RTOS基礎固め」と「FreeRTOSプロトタイプ開発のスタートプロジェクトとなること」の2点です。

RTOS開発は、ベアメタル開発とは異なります。

RTOS Kernelが、開発した処理(タスクやThread)と他タスクの優先順位により、処理実行/待機を決めます。開発タスク単体の流用性は高まりますが、タスク間同期や通信に、セマフォやQueueなどのRTOS独特の手段が必要です。

IoTにより全てのモノ(MCU)がクラウドへ接続する時代の基盤は、RTOSです。

ベアメタル開発経験者が、このRTOSの早期基礎固め、Kernelと自身で開発したタスクの並列処理を理解するには、個々にRTOS手段を説明するサンプルソフトよりも、具体的なRTOSアプリケーションの方が実践的で役立ちます。

RTOSアプリケーションがあれば、優先順位を変えた時のタスク動作変化や、その他経験に基づいたRTOS実務開発で知りたい事柄を手間なく試し、新たな知見・見識を得られるからです。これらは、サンプルソフトや、説明文から得ることは困難で、実際のRTOSアプリケーションで開発者自身が試行するのがベストです。

そこで、各FreeRTOS手段を説明した弊社MCU RTOS習得ページを理解した次の段階として、最初の図に示したプロトタイプ開発着手に必須となるADC/LCD/SW/LED/VCOM処理を、NXP)LPCXpresso54114(Cortex-M4/150MHz、Flash/256KB、RAM/192KB)とBaseboard、Arduinoプロトタイプシールドに実装し、動作確認済みRTOSプロジェクトが、FreeRTOSアプリケーションテンプレートです。

FreeRTOS Application Template (NXP Version)
FreeRTOS Application Template (NXP Version)

※上記プロジェクトは、クラウド接続は行っておりません。RTOS基礎固めとFreeRTOSプロトタイプ開発に適すことが目的ですので、クラウド接続RTOSライブラリは未実装です。

FreeRTOSを選んだのは、現在MCU RTOSシェア1位だからです(関連投稿はコチラ)。RTOS手段は、各RTOS共通技術であるSemaphoreとQueueの2つを用いております。LPCXpresso54114のFlashやRAM使用量にはまだ十分余裕がありますので、より高度なミューテックスやイベントグループなどの手段を適用するのも容易です。

特徴

本テンプレートには、上記FreeRTOSプロジェクトと同じ動作確認済みのベアメタル開発プロジェクトも添付しております。これは、ベアメタル開発に慣れた方が、FreeRTOSとベアメタルの差分をより明確に理解し、比較や評価をするためです(比較・評価は、ご購入者ご自身で行って頂きます)。

本テンプレート付属説明資料は、主にベアメタル開発者視点から見たFreeRTOSプロジェクトを解説しており、ベアメタルプロジェクトに関する説明は、ソースコードを読めばご理解頂けるとして省略しております。

従って、FreeRTOSアプリケーションテンプレートは、ベアメタル開発経験者を対象といたします。ベアメタル初心者の方は、先ずは各MCUベンダCortex-M0+/M3コア対応の従来マイコンテンプレートをご購入ください。従来テンプレート付属説明資料には、ベアメタル動作の詳しい説明が付いています。

※本テンプレートのベアメタルプロジェクトは、従来テンプレートCortex-M0+/M3コアをCortex-M4コア対応へ発展させたものです。ベアメタルプロトタイプ開発着手時に適すプロジェクトです。

FreeRTOSアプリケーションテンプレートは、ベアメタル開発経験者が、手間なく直にRTOSとベアメタルの差を理解・実感し、かつ、IoT基盤RTOSの効率的な基礎固めができるツールです。

なお、既に従来マイコンテンプレートご購入者様は、50%OFF特典があり、税込1000円にて本FreeRTOSアプリケーションテンプレートをご購入頂けます。弊社での確認ミスを防ぐため、ご購入時に従来テンプレート購入者様である旨、お知らせください。

勿論、従来テンプレートとFreeRTOSアプリケーションテンプレートの同時購入でも、この特典は適用されます。

まとめと今後

ベアメタル開発経験者が、IoT MCUクラウド接続に必要となるRTOSの効率的な基礎固め、FreeRTOSプロトタイプ開発着手プロジェクトとして使えることを目的に、NXP)LPCXpresso54114、Baseboard、Arduinoプロトタイプシールドを使ったFreeRTOSアプリケーションテンプレートを発売しました。

本テンプレートは、Amazon FreeRTOSのHardware Independent FreeRTOS Exampleを原本としています。第1弾はNXP)LPCXpresso54114へ適用しましたが、今後、STマイクロエレクトロニクス)STM32G4やCypress)PSoC 6など他社Cortex-M4コアの対応版も開発予定です。