ベアメタルかRTOS開発か?

弊社MCUテンプレートご購入者様から、ベアメタルかRTOS、どちらの開発が良いかについてご質問がありました。
ご質問者同意を得ましたので、筆者回答を一部修正、抜粋して示します。

Summary:クラウド接続=RTOS開発、スタンドアロン=ベアメタル開発

RTOS vs. BareMetal
RTOS vs. BareMetal

AWSやAzure RTOSなどのクラウドへ接続するMCUは、RTOS(FreeRTOS/Azure RTOS)開発が必須です。クラウド接続やセキュリティ確保に、専用RTOSライブラリ利用が必要だからです。また、大規模、複数開発者の場合も、RTOS開発が向いています。

スタンドアロン動作のMCUは、ベアメタル開発をお勧めします。MCU動作を全て開発者で管理・制御できるからです。

ベンダ提供サンプルコードとMCU評価ボードを活用すると、ベアメタル/RTOSどちらの開発でも、高品質・短期間で製品のプロトタイプ開発ができます。弊社MCUテンプレートは、サンプルコード活用プロトタイプ開発に適しています。

クラウド接続MCU:割込みベースRTOSタスク開発

AWS (Amazon Web Services)やAzure (Microsoft Azure Cloud Services)へ接続するMCUは、クラウド接続用に、FreeRTOSやAzure RTOS接続ライブラリの利用が前提条件です。また、高度なセキュリティ対策が求められますので、クラウド側提供セキュリティライブラリを使うことも求められます。

従って、クラウド接続MCUは、必然的にRTOS開発となります。

通信やセキュリティ以外の処理は、タクス(スレッドとも言うが、以下タスクと略)の開発が、ユーザ開発内容です。

タスクは、移植性が高い単位に機能分割し、割込みベースで作成します。複数タスクの割込み処理や優先順位を管理・処理するのが、RTOSの役目です。

RTOSが優先順位に基づいて個々のタスクをMCUに割当てることで、複数タスクの並列処理が進みます。シングルコアMCUの場合、一度に実行するタスクは1個です。従って、タスクは時分割処理です。分割タイミングが短く、しかも優先順位に基づいたタスク処理ですので、複数タスクが並列処理しているように見えます。

タスクは、別タスクのことを考慮せず独立性、移植性高く開発可能です。その代償として、RTOSが複数タスク間優先制御を行うセマフォ/ミューテックス/イベントフラグなど、また、タスク間通信を行うメッセージバッファ/メールボックスなどのRTOS独自機能を、開発タスクに組込む必要があります。

関連投稿:RTOS習得

移植性や独立性が高い開発済タスクは、ベアメタル比、ソフトウェア資産として他プロジェクトへもそのまま使えるメリットがあります。また、ソフトウェア規模が大きく、複数開発者で共同開発する時も、機能完全分離RTOS開発の方が優れると言われます。

スタンドアロンMCU:ポーリングベースベアメタル開発

RTOSが行う周辺回路の割込み処理や優先制御を、全てユーザが行うのがベアメタル開発です。

但し、デバッグや処理開発のし易さを考慮すると、ポーリングベース開発をお勧めします。

つまり、周辺回路の割込みフラグを、一旦、割込み処理待ちフラグへ置換え、この割込み処理待ちフラグをポーリングすることで処理を実行する方法です。割込み処理待ちフラグは、RAMへ展開されますので、開発処理もRAMフラグで制御でき、割込みを直接扱うよりも単体デバッグが容易になります。

ベアメタル開発は、単体デバッグ済みの複数処理を、MCU全体で上手く実行する制御部分も必要です。弊社ベアメタルMCUテンプレート英語版MCUテンプレートは、この制御部分を提供します。

サンプルコード活用プロトタイプ開発

サンプルコード活用プロトタイプ開発
サンプルコード活用プロトタイプ開発

RTOSはタスク、ベアメタルは周辺回路制御のソフトウェア開発が必要です。

但し、ベンダは、周辺回路制御の参考となるソフトウェアを、サンプルコードとしてMCU評価ボードと共に提供します。サンプルコードは、ベンダ専門家が開発した評価ボード動作確認済み高品質コードですので、これをユーザが利用しない手はありません。

現在サンプルコードは、ベアメタル用のものが殆どです。しかし、RTOSタスク開発へも応用できます。サンプルを上手く利用することで、0から開発するよりも、短時間でソフトウェア開発ができます。

また、評価ボードMCU周りの部品配置やアートワーク配線は、処理性能過不足時のMCU交換や耐ノイズ性が高いハードウェア開発の参考書になります。

MCU開発を高品質・短期間で行うには、サンプルコードとMCU評価ボードを活用し、製品プロトタイプ開発がお勧めです。プロトタイプから製品へフィードバックをかければ、より良い製品化が可能です。

Afterword:ベアメタル開発からRTOSへステップアップ

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

Windowsアプリ開発時は、Windows APIの利用は当たり前です。多くの解説書もあります。

IoT MCU開発時も、FreeRTOSやAzure RTOSが当然になると思います。ただMCU開発には解説書が少なく、その理解には基礎知識が必要です。基礎がグラつくと、その上の積み重ねは非常に困難です。

MCU開発の基礎は、ベアメタル開発です。IoT普及でRTOS MCU開発も増えます。IoTに向けてRTOSを勉強しようと考える方も多いと思います。その場合は、ベアメタル開発の何をRTOSが代行し、何が得られ、何を失うか、RTOSオーバーヘッドはどの程度かを考えながら学習すると、より効率的にRTOS習得ができます。

例えば、RTOS開発には、セマフォやミューテックスなどのベアメタル開発に無い多くのRTOS機能を新に学ぶ必要があります。しかし、よく使う機能は少数です。ご自分のベアメタル手法を代行するRTOS機能から学び始め、それでも足りない機能はRTOS側に用意されていますので、順次増やしながらタスクを開発して行くと良いと思います。

ソフトウェア開発は、AI Copilot出現で激変への過渡期です。数年後には、ライブラリ組み換え作業などへ開発が変わり、不足がちなMCU開発解説もAIが代行してくれるかもしれません。

そんな全能AI過渡期でも、ご自分自身で獲得した基礎の重要性は、変わらないと筆者は考えます。


FreeRTOSユーザタスクの作り方

ベアメタルサンプルソフトを活用したFreeRTOSユーザタスクの作り方を示します。先に結論を言うと、ベアメタルサンプルソフト無限ループ内に、RTOS待ち処理を挿入するだけでFreeRTOSタスク開発ができます。

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

RTOS環境のユーザタスク開発

IoT MCUをAWSやAzureなどのクラウドへ接続する時には、FreeRTOSやAzure RTOSなどのRTOSが必須です。クラウド接続用のRTOSタスク集が入ったライブラリを利用するからです。もちろん、このライブラリ内のタスク開発は必要ありません。

問題は、このIoT MCU RTOS環境で、ユーザタスクをどのように開発するかです。

RTOSの目的は、タスク独立性とリアルタイムなタスク並列多重、MCUハードウェア隠蔽です。ベアメタル開発経験者にとっては、ソフトウェア動作環境が著しく異なることが解ります。

RTOS開発障壁を下げるアプローチ

そこで、ベアメタル開発経験者は、先ずこのRTOS環境の理解に努めます。

セマフォやミューテックス、QueueなどRTOS特有の手段を理解します。弊社も各種FreeRTOS機能を説明しましたし、ウェビナー等でも同様です。但し、このアプローチAは、「RTOSの手段」理解が最初に来ますので、障壁が高いと感じる方も多いでしょう。筆者はそうでした。

そこで、お勧めするのは、RTOS手段をざっと読んだら、今度は逆に「RTOSの目的」からRTOS環境で、複数ユーザタスクを並列多重するアプローチBです。

複数ユーザタクスを、どうすればRTOSへ組込むかを検討するこの逆アプローチBは、Aよりもベアメタル開発経験者向きで、しかもRTOS手段は後回しですので障壁が低く感じられます。

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

2個のベアメタル処理をタスク化し、RTOSで並列多重処理する例で考えます。

・処理#1:緑LEDを、1秒毎にトグル点灯
・処理#2:赤LEDを、SW押下げでトグル点灯

ベアメタル開発経験者なら、どちらの処理も簡単に開発できます。処理概要は、最初図1の左側になります。

違いは判断内容で、処理#1が1秒経過、処理#2がSW割込みです。もちろん、両処理を並列に多重するのは、ベアメタル開発では工夫が必要です。処理#1と#2は、別々のプロジェクト、例えば2個のサンプルプロジェクトとして提供されるのが一般的です。

両処理をタスク化して組込むRTOSには、LPCXpresso54114のSDK付属generic_freertosプロジェクトを用います。“generic”が示すように、ハードウェアに依存しない汎用的なFreeRTOSプロジェクトです(generic_freertosの詳細は、コチラの関連投稿を参照してください)。

RTOSへ組込んだ時のタスク処理概要が、図1の右側です。ベアメタルとの違いは、タスク#1は、遅延処理vTaskDelayを無限ループに加えること、タスク#2は、割込みISRからの同期セマフォ受信を無限ループに加えることだけです。

両処理へ追加したのは、どちらも「RTOS処理待ち」です。この処理待ちを、RTOSが解除/待ちに切替えることで、複数タスクが並列に動作します。

RTOSは、複数タスクを処理待ち状態にし、処理待ちタスクの中から優先順位に応じて1個のタスクを実行状態に割当てます。RTOS(Kernel)自身が、順位判断や実行タスクの切替え、タスク実行状態の保存/リカバリのためスタックプッシュ/ポップ処理を行い、それらの処理間隔がTICK_RATEです。

リアルタイムでタスクを切替えるには、高速なKernel動作(AWSによると25MHz以上)と短期間のTICK_RATE(通常1ms)が必要で、タスク数に応じてスタック使用量(AWS RAM 64KB以上)は急増します。
※数値で示したAWS FreeRTOS必須条件の詳細は、コチラのハードウェア最小仕様要件を参照してください。

要するに、RTOSへユーザタスクを追加するには、ベアメタルでユーザ処理を開発し、その無限ループ内にRTOS処理待ちを加えさえすれば、RTOSユーザタスクになります。

ベアメタル開発経験者がデバッグし慣れた処理がそのままRTOSユーザタスク開発にも使え、RTOS処理待ちは、generic_freertosに実装済みのセマフォとQueueのRTOS手段だけでも、リアルタイムタスク並列多重のRTOSアプリケーション開発ができます。

まとめ

本稿は、IoT MCU RTOS環境でユーザタスクを開発し、FreeRTOSへ実装する方法として、ユーザ処理をベアメタルで開発し、無限ループ内へRTOS処理待ちを加えタスク化する方法を説明しました。

RTOS処理待ちは、セマフォとQueueのRTOS手段を理解していれば、プロトタイプ段階のFreeRTOSアプリケーションとしては十分です。ユーザ処理を自主開発する代わりに、ベンダ提供のベアメタルサンプルソフトを活用すれば、豊富なサンプル処理のFreeRTOSタスク化も簡単です。

タスク化処理を組込むRTOSには、NXP)LPCXpresso54114 SDK付属のgeneric_freertosプロジェクトを使います。このプロジェクトは、ハードウェア非依存の汎用FreeRTOSプロジェクトで、セマフォとQueueを実装済みです。そこで、これら2つのRTOS手段を手始めに理解すれば、RTOS開発障壁も低くなります。

あとがき

本稿で示したユーザタスク追加方法により開発したNXP)LPCXpresso54114(Cortex-M4/150MHz、Flash/256KB、RAM/192KB)で動作確認済みのFreeRTOSアプリケーションテンプレートは、6Eにリリース予定です(ADC入力とLCD出力、VCOM入出力処理も追加済み)。

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

このテンプレートには、FreeRTOSプロジェクトに加え、同じアプリケーション動作のベアメタルプロジェクトも添付します。ベアメタル処理に処理多重の工夫を加えた弊社Cortex-M0+/M3コア向けBaseboardテンプレートを、Cortex-M4コアへも適用したベアメタルプロジェクトです。

FreeRTOS開発とベアメタル開発の、Flash/RAM使用量差、開発難易度、消費電力差などCortex-M4コアMCU開発で実務上知りたい事柄を直接比較・評価することが可能です。また、どちらのプロジェクトも、基本的アプリケーションのテンプレート(=スタートプロジェクト)としても活用でき、プロトタイプ開発に最適です(FreeRTOS/ベアメタルの2プロジェクト+説明資料、税込2000円)。

また、STマイクロエレクトロニクス)STM32G4(Cortex-M4/170MHz、Flash/512KB、RAM/96KB)対応版も開発を予定しています。

FreeRTOSアプリケーションテンプレートを使ったプロトタイプ開発の次の段階としては、セマフォやQueue以外のミューテックスやイベントグループなどのより高度なRTOS手段の利用や、高速でRAM使用量も少ないタスク通知手段などのチューニング開発へとステップアップすることです。

FreeRTOSアプリケーションテンプレート構想

2021年6E目標に、FreeRTOSアプリケーションテンプレート新発売(税込価格2000円予定)を目指しています。このFreeRTOSアプリケーションテンプレート構想を示します。

FreeRTOSアプリケーションテンプレート構想骨子

FreeRTOSアプリケーションテンプレート構成ボード
FreeRTOSアプリケーションテンプレート構成ボード
  • 実務利用可能なFreeRTOSアプリケーションテンプレート提供
  • FreeRTOS開発とベアメタル開発のアプリケーション直接比較可能
  • 第1弾はNXP)LPCXpresso54114のSDK(Software Development Kit)で開発、次回STMのコード生成ツールなど利用予定

FreeRTOSソフトウェア開発は面白いです。従来ベアメタル開発手法が使える部分と、新たにFreeRTOS向きの工夫が必要な部分、つまり差分があるからです。

弊社FreeRTOSアプリケーションテンプレートは、この面白さや差分を開発者に味わって頂き、IoT MCUのRTOS普及期に備えることを目的に開発しようと考えています。

対象者は、既にMCUベアメタル開発ができ、新たにFreeRTOSを習得したい開発者とします。過去に弊社テンプレートのご購入者様は、50%割引特典の1000円で購入できます。MCUコアは、FreeRTOS能力を十分引き出すCortex-M4クラスを利用します。

FreeRTOS講座問題点

MCUベンダによるFreeRTOS講座は、①FreeRTOS基礎知識、②FreeRTOSのIDE利用方法、③クラウド接続例など盛りだくさんの内容です。

  1. FreeRTOS基礎知識で、セマフォなどのFreeRTOS関連技術やタクス分割、ユーザタスクプライオリティ、RAM使用量増加などが理解できますが、サンプルコード以外の具体的なアプリケーションでもFreeRTOSを動作させたいと欲求不満になります。
  2. FreeRTOSのIDE利用時、特にコード生成ツールをIDEと併用する場合、①で使ったFreeRTOSサンプルソースコードに、更にベアメタル開発が前提のコード生成ツール出力コードも加わるため、追加分がFreeRTOS理解の邪魔になります。
  3. IoTクラウド接続にFreeRTOSは必須です。しかし、主流のAWS(Amazon Web Services)以外にもMicrosoftのAzureなどもあり、FreeRTOS以外の様々な知識(例えばMQTTプロトコルなど)がクラウド接続のためだけに必要です。

FreeRTOS本体とユーザ追加タスク、この「両方の動作」をしっかりと把握しないとFreeRTOS開発のメリットが享受できないこと、これがベアメタル開発との最大の差です。

FreeRTOSとベアメタルとの違いを理解することが最優先、2. はSDK利用で回避、3. は時期尚早です。

ベンダ講座の主旨は、①FreeRTOS基礎知識に加え、自社製品へのユーザ囲い込みも目的のため、②や③は必然です。しかし、現段階ではFreeRTOSそのものを知り、IoT MCUのRTOS普及期(FreeRTOS、Mbed OS、μITRONなど)に備えるためのツールが欲しいと思い、ネット検索しましたが見当たりません。

そこで、開発するのが弊社FreeRTOSアプリケーションテンプレートです。

FreeRTOSアプリケーションとベアメタル比較

FreeRTOSサンプルコードは、セマフォなどのFreeRTOSで使う技術解説が目的です。従って、サンプル付属タスクはシンプルで解り易く作られています。

サンプルコードは、実務アプリケーションとは乖離しており、タスク分割やユーザタスクが複数ある時の優先順位設定、RAM使用量がベアメタル比どれ程増加するかなど肝心のFreeRTOS実務利用時ノウハウは、サンプルコードからは判りません。

そこで、弊社が過去提供してきたベアメタル開発のIoT Baseboardテンプレートと同じ動作のアプリケーションを、FreeRTOSを使って開発します。つまり、同じ評価ボードで同じアプリケーション動作を、FreeRTOSとベアメタルの両方で開発します。

ベアメタル開発IoT Baseboardテンプレート(評価ボードはFRDM-KL25Z、これがLPCXpresso54114に変る)
ベアメタル開発IoT Baseboardテンプレート(評価ボードはFRDM-KL25Z、これがLPCXpresso54114に変る)

FreeRTOS/ベアメタル両アプリケーションの比較により、複数実務タスクでの優先順位設定やRAM増加量が具体的に判ります。また、優先順位やRAM使用法などのFreeRTOS重要パラメタを変えた時の動作変化も判ります。

もちろん一例にすぎませんが、FreeRTOS/ベアメタルのアプリケーション差、開発困難/容易、消費電力差など、実務開発時に知りたい事柄を評価でき、かつ、基本的なFreeRTOSアプリケーションのテンプレートとしても利用可能です。
※FreeRTOS/ベアメタル評価は、ご購入者様ご自身で行ってください。

FreeRTOSアプリケーションテンプレートは、下記動作を予定しています。

  • 評価ボード搭載LED周期点滅とVCOMメッセージ入出力
  • Arduinoプロトタイプシールド搭載ユーザSWプッシュによる搭載LED点滅
  • Baseboard搭載LCDメッセージ出力とポテンショメータADC変換値のLCD出力

FreeRTOS/ベアメタル両アプリケーションは、評価ボード+Arduinoプロトタイプシールド+Baseboardで動作確認済みです。FreeRTOSアプリケーションテンプレートには、FreeRTOS/ベアメタルそれぞれの動作プロジェクトファイルがあり、FreeRTOSアプリケーション詳細説明を付属資料へ添付します。
※ベアメタルアプリケーションの説明は、紙面が多くなり、過去弊社テンプレートご購入者様には不要ですので省略予定です。

SDKとコード生成ツールのAPI比較

FreeRTOSアプリケーションテンプレートの第一弾評価ボードは、NXPのLPCXpresso54114 (Cortex-M4/100MHz、256KB/Flash、192KB/RAM)を使います。

弊社MCU RTOS習得(2020年版)の解説にも使っていること、FreeRTOSサンプルコードが11種類と多く、かつSDKで提供されていることが理由です。

SDKとコード生成ツールのAPI比較は、コチラの関連投稿の3章をご覧ください。SDK利用を、関連投稿ではMCU設定タイプと記載しています。

APIパラメタが多いのがSDKです。このパラメタをFreeRTOS側でも使う可能性があること、コード生成ツールの使い方を別途説明しなくてもFreeRTOSサンプルコードのみに集中できること、これらも第一弾評価ボードにLPCXpresso54114を選定した理由です。

STマイクロエレクトロニクスのコード生成ツール:STM32CubeMXも、FreeRTOSアプリケーション開発に適応済です。第1弾はSDK利用ですが、STM32G4(Cortex-M4/170MHz、512KB/Flash、96KB/RAM)評価ボードなど、コード生成ツール利用のCortex-M4クラスMCUも、順次FreeRTOSアプリケーションテンプレートを開発したいと考えています。

クラウド接続はブラックボックスライブラリ利用

IoT MCUと接続するクラウドは、無償ではありません。接続には、クラウド側から有償接続ライブラリを取得し、これをIoT MCUのFreeRTOSへ組込んだ後、必要な接続APIを利用します。

有償ライブラリ自身は、ユーザがその内容を変える必要は無く、ブラックボックスとして利用するだけです。IoTクラウド接続時には必須ですが、FreeRTOS理解・習得時には不要です。

まとめ

Cortex-M4クラスのIoT MCUへFreeRTOSを利用するメリットは、独立の単体タクス設計ができ開発タスク資産化も容易なことです。

しかし、複数タスクをFreeRTOSで上手く動作させるには、タスク間の優先順位設計やRAMメモリ使用法などベアメタル開発には無かったFreeRTOS向けの新スキルが必要になります。

これらスキル習得とFreeRTOS基礎固め、FreeRTOS/ベアメタル比較評価のため、開発者個人で低価格購入できるFreeRTOSアプリケーションテンプレートを6E目標に開発予定です。これは、基本的なFreeRTOSアプリケーションのテンプレートとしても利用可能です。

発売時には、FreeRTOSアプリケーションで実際に使用した実務FreeRTOS技術、優先順位設計結果なども付属資料で示します。

本FreeRTOSアプリケーションテンプレートに関するご意見などは、info@happytech.jpへお寄せください。