FreeRTOS/Azure RTOSソフトウェア開発手法

ルネサス公式センササンプルコードを使って、ベアメタル処理を起点とするRTOS(FreeRTOS/Azure RTOS)ソフトウェア開発手法を説明します。

筆者にしては、長い投稿です。要旨は、「ベアメタル処理+RTOS処理待ち=RTOS処理」です。

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

センササンプルコード

  1. FS2012 Sample application – Sample Code
  2. HS300x Sample application – Sample Code
  3. ZMOD4xxx Sample application – Sample Code

説明に用いたセンササンプルコードが、上記3種類です。ダウンロードには、ルネサスのログインが必要です。同一動作のベアメタル/FreeRTOS/Azure RTOS、3個のe2studioプロジェクトが同胞されています。動作MCUは、ルネサス)RA/RX/RE/RL78ファミリです。

サンプルコードマニュアルだけは、下記からログイン不要でダウンロードできます。本稿は、これらマニュアル情報だけで読める工夫をしました。

  1. FS2012 Sample application
  2. HS300x Sample application
  3. ZMOD4xxx Sample application

FS2012がガスフローセンサ、HS300xが湿度・温度センサ、ZMOD4xxxが高性能ガスセンサです。この順番で、サンプルコードが複雑になります。

そこで、焦点を、一番簡単なFS2012サンプルコード、動作MCUをRA6M4(Cortex-M33/200MHz/1MB Flash/256KB RAM)に絞って説明します。他サンプル/MCUでも同様の結果が得られます。

なお、3サンプルコードは、ベアメタルからRTOS開発へステップアップする時にも適したコードです。

センサとMCU間接続:I2C

PMODインタフェースによるセンサボードとMCU接続
PMODインタフェースによるセンサボードとMCU接続

センサとMCU間は、サンプルコード全てPMOD経由のI2C接続です。従って、I2C接続センサのIoT MCU制御例としても応用可能です。FreeRTOSとAzure RTOS、両方に対応した点が便利です。

PMODとは、米Digilent社規定のオープンインタフェース規格です。図示のように、複数センサボードを、レゴブロックのようにMCUへ追加接続できる特徴があります。

ベアメタルとFreeRTOS/Azure RTOSメモリ量

FS2012サンプルコードマニュアルより抜粋した使用メモリ量比較です。

ベアメタル FreeRTOS Azure RTOS
Flash 1065 bytes 1374 bytes 1342 bytes
RAM 73 bytes 249 bytes 246 bytes

RTOSは、ベアメタル比1.3倍のFlash使用量、3.4倍のRAM使用量です。但し、上表にRTOSタスク/スレッドのスタックメモリ量は含みません。

Flash/RAM使用量が増加しますが、RTOS開発ソフトウェア流用性が高まるメリットがあります。これら増加分は、ベアメタル単体処理からRTOSマルチタスク/スレッド処理のオーバーヘッドに相当すると考えて良いでしょう。

マルチタスク/スレッド以外にも、RTOS開発には、クラウド接続/セキュリティ/OTA(Over The Air)処理などのオーバーヘッドが別途必要です。

これら処理のため、IoT MCUは、ベアメタル比、Flash/RAM量の十分な余裕と高速動作が必要になります。

FS2012センサAPI使用方法

FS2012フローセンサの使用APIとその利用手順です。一般的なセンサでも同様で、特に変わった点はありません。

FS2012 APIと利用手順
FS2012 APIと利用手順

ベアメタル処理フロー

RTOS開発の起点となるベアメタル開発の処理フローです。

FS2012のベアメタル処理フロー
FS2012のベアメタル処理フロー

初期設定で、I2Cとセンサを初期化し、無限ループ内で、センサデータ取得と取得データの演算を繰返します。センサデータの連続取得に409.6ms遅延時間が必要であることも判ります。センサデータ取得完了は、センサ割込みを使って検出しています。

このベアメタル処理フローも、特に変わった点はありません。

RTOS処理フロー

ベアメタルと異なる処理だけを橙色抜粋したFreeRTOS処理フローです。

ベアメタル処理とRTOS処理のフロー差分
ベアメタル処理とRTOS処理のフロー差分

差分は、RTOS遅延:vTaskDealy()/tx_thread_sleep()で409.6msと1msが加わる点、vTaskDelete()/tx_thread_delete()でタスク削除する点です。

また、センサ制御本体は、タスク/スレッド記述へ変更し、セマフォにより別タスク/スレッドとの排他制御を行います。

1ms遅延は、別タスク/スレッド切替えに必要です(関連投稿のコチラ、6章コンテキストスイッチ参照)。FS2012サンプルは、タスク/スレッド数が1個なので切替え不要です。

しかし、例えば、HS300xセンサボードを、FS2012センサボードへレゴブロック様式で追加した時は、FS2012センサとHS300xセンサの2タスク/スレッドを、この1msスリープでRTOSが切替えます。

FS2012センサは、ベアメタル処理フローで示したデータ取得間隔に409.6ms遅延処理が必要です。この遅延中に、HS300xセンサのデータ取得を行えば、両タスク/スレッドの効率的な並列多重ができ、これにセマフォ排他制御を用います。

※RTOS遅延処理は、本稿最後の補足説明参照。RTOSメリットが具体的に判ります。

この切替え処理が、本稿最初の図で示したRTOS処理待ちに相当します。その他のRTOS処理フローは、ベアメタル処理と同じです。

つまり、RTOS処理とは、単体のベアメタル処理へ、RTOS処理待ちを加え、複数のベアメタル処理を並列処理化したものです。

数式的に表すと、「ベアメタル処理+RTOS処理待ち=RTOS処理」です。

RTOS(FreeRTOS/Azure RTOS)ソフトウェア開発手法

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

ベアメタル処理を、効率的に複数並列動作させるのがRTOSの目的です。

この目的のため、優先制御や排他、同期制御などの多くの機能がRTOSに備わっています。RTOSの対象は、個々のベアメタル処理です。つまり、ベアメタル開発スキルを起点・基盤としてその上層にRTOS機能がある訳です。

RTOS習得時、多くの機能に目移りします。しかし、本稿最初の図に示したように、RTOSは、複数ベアメタル処理(タスク/スレッド)を、優先度や排他・同期条件に応じて切替え並列多重化します。

逆に、ベアメタル側からRTOSを観ると、セマフォ/Queueなど「RTOSによる処理待ち」がベアメタル無限ループ内に入っただけに見えます。「待ち/解除の制御は、RTOS」が行います。待ち処理の種類が、セマフォ/Queue/イベントフラグ……など様々でも、「ベアメタル側からは単なる待ち」です。

筆者が、RTOS開発の起点はベアメタル処理、とした理由が上記です。

つまり、ベアメタル起点RTOSソフトウェア開発手順は、

1:単体ベアメタル処理開発。単体デバッグ後、タスク/スレッド化。
2:タスク/スレッド無限ループ内へ、RTOS処理待ち挿入。
3:複数タスク/スレッド優先度を検討し、RTOS結合デバッグ。

以上で、RTOSソフトウェア開発ができます。

処理自体は、1でデバッグ済みです。2以降は、効率的RTOS処理待ち挿入と、複数タスク/スレッド間の優先度検討が、主なデバッグ内容です。複数タスク/スレッドが想定通り並列動作すれば、第1段階のRTOSソフトウェア開発は完了です。

スタックメモリ調整やより効率的な待ち処理などのチューニングは、3以降で行います。

RTOS待ち処理は、セマフォやQueueの利用頻度が高いため、RTOS習得もセマフォ/Queueを手始めに、より高度な待ち処理機能(イベントフラグなど)へと順次ステップアップしていけば良いでしょう。

ベアメタル開発経験者が感じるRTOS障壁

ベアメタルは、開発者自身が全ての制御を行います。ところが、RTOS開発では、ソースコード内に、自分以外の第3者:RTOSが制御する部分が混在します。ここが、ベアメタル開発経験者の最初のRTOS違和感、RTOS障壁です。

前章の手法は、1でベアメタル処理を完成すれば、2以降は、RTOS処理のデバッグに集中できます。つまり、既に持っているベアメタルスキルと新しいRTOSスキルを分離できます。これで、最初に感じたRTOS障壁は小さくなります。

また、RTOS障壁は、IoT MCUクラウド接続時の通信処理やセキュリティ処理時に、MCUベアメタル開発経験者に大きく見えます。しかし、これらの処理は、決まった手順で当該ライブラリやAPIを順番に利用すれば良く、一度手順を理解すれば、本当のRTOS障壁にはなりません。

クラウド接続やセキュリティ処理サンプルコードを入手し、各API利用手順の理解後は、これら該当処理の丸ごと流用でも十分に役立ちます。

まとめ:RTOSソフトウェア開発手法

IoT MCU RTOSソフトウェア開発の3分野
IoT MCU RTOSソフトウェア開発の3分野

IoT MCUは、クラウド接続のためRTOS開発になります。IoT MCU RTOS開発は、データ収集、クラウド接続、エッジAIやIoTセキュリティなど、大別すると3分野に及びます(関連投稿:世界最大情報通信技術(ICT)サービス輸出国、アイルランドIoT事情)。

本稿は、センササンプルコードを使い、ベアメタルスキル起点・基盤としたデータ収集分野のRTOSソフトウェア開発手法を説明しました。

1:単体ベアメタル処理開発。単体デバッグ後、タスク/スレッド化。
2:タスク/スレッド無限ループ内へ、RTOS処理待ち挿入。
3:複数タスク/スレッド優先度を検討し、RTOS結合デバッグ。

数式的に示すと、「ベアメタル処理+RTOS処理待ち=RTOS処理」です。

クラウド接続とエッジAI/IoTセキュリティ分野は、決まった手順のRTOSライブラリ活用などが主な開発内容です。従って、この分野は、差別化の努力は不要です。

IoT MCU RTOS開発で、他社差別化できるデータ収集RTOSソフトウェア開発の手法を説明しました。

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

RAベアメタルテンプレート概要
RAベアメタルテンプレート概要

2022年5月にRAベアメタルテンプレート(1000円税込)を発売しました。本稿説明のRTOS(FreeRTOS/Azure RTOS)ソフトウェア開発には、ベアメタルスキルが必須です。

RAベアメタルテンプレートにより、開発ツール:FSP(Flexible Software Package)やe2studioの使い方、豊富なベアメタルサンプルコードを活用したベアメタル開発スキルが効率的に得られます。ご購入は、コチラから。

RA版RTOSテンプレート(仮名)は、検討中です。

NXP版FreeRTOSテンプレート発売中

NXP版FreeRTOSテンプレートも発売中です。また、本年度中には、ST版Azure RTOSテンプレートも、開発・発売予定です。

弊社ブログは、RTOS関連も多数掲載済みです。ブログ検索窓に、FreeRTOSやAzure RTOSなどのキーワードを入力すると、関連投稿がピックアップされます。

補足説明:RTOS遅延処理

RTOS遅延処理のvTaskDealy(409.6ms)/tx_thread_sleep(409.6ms)は、他タスク/スレッドの処理有無に関わらず409.6msの遅延時間を生成します。これは、ベアメタル開発者にとっては、夢のようなRTOS APIです。

このようにRTOSは、開発ソフトウェアの独立性・流用性を高めるマルチタスク/スレッド動作を実現し、ベアメタルの補完機能を提供します。

つまり、ベアメタル開発中に、他処理の影響を受けるので開発が難しいと思う部分(例えば、上記遅延処理など)があれば、RTOSのAPI中に解が見つかる可能性があります。

あとがき

長い投稿にお付き合いいただき、ありがとうございました。

ベアメタル開発経験者がRTOS習得・開発を目指す時、サンプルコード以外の情報が多すぎ、途中でくじけそうになります。本稿は、サンプルコードとベアメタルスキルを活かしRTOS開発へステップアップする手法を示しました。RTOSでも、基本はベアメタルスキルです。

RTOSサンプルコードが豊富にあれば、必要情報の絞り込み、RTOSスキル向上も容易です。掲載RTOSサンプルコードは、非常に貴重だと思いましたので、RTOSソフトウェア開発手法としてまとめました。

RAテンプレート仕組み

ルネサスRAファミリテンプレート(ベアメタル編)を3月末目標に開発中です。サンプルコード活用・流用によるアプリケーション開発が容易なことが、弊社テンプレートの特徴です。このテンプレート仕組みを “少しだけ(!?)” 説明します。

全部説明すると、読者ご自身でテンプレートを開発し、購入者数が減るかもしれないからです😂。

仕組みまとめ

MCU開発者の最初の壁に穴をあけるテンプレート
MCU開発者の最初の壁に穴をあけるテンプレート

テンプレートの仕組みを “少し” しか説明しないので、まとめを最初に示します。

MCUアプリケーション早期開発は、ベンダ提供の公式サンプルコード活用・流用が王道です。しかし、単機能の利用例を判り易く示すことが目的のサンプルコードでは、複数機能の並列実装が困難です。

MCU開発の最初の壁が、この「サンプルコードを、どのように実開発へ利用するか」です。

既に弊社テンプレートの購入者様、または上級者は、この壁を突破し効果的サンプルコード活用アプリケーション開発方法を知っています。Know-how(ノウハウ)です。

サンプルコード利用時の課題は、「無限ループ」です。

この課題に、弊社テンプレートは時分割で対応しました。説明を更に加えると、読者がご自分でテンプレート相当を開発される危険性がありますので、仕組み説明はここまでにします。

以降の章は、サンプルコード課題の具体例を示します。また、この課題が生じる原因、特にRAファミリ開発でFSPサンプルコードが重要である訳を説明、最後にテンプレートのメリットを示します。

RAファミリに限らずプロトタイプ開発や早期アプリケーション開発が目的の弊社テンプレートにご興味がある方は、テンプレートサイトに主要ベンダテンプレートが各1000円で販売中、概要は無料ダウンロード可能です。

※RAファミリテンプレート(ベアメタル編)も1000円予定。FreeRTOS対応アプリケーションテンプレートのみ2000円。RAファミリテンプレートもV2以降でRTOS対応予定。

販売テンプレートには、本稿で説明できない多くの工夫も実装済みです。ダウンロード概要を読んで、自作されるよりも、弊社から是非ご購入ください😌。

サンプルコード課題の具体例

評価ボードテストプログラム構造(FPB-RA6E1の例)
評価ボードテストプログラム構造(FPB-RA6E1の例)

サンプルコードを実開発へ利用する時の課題、具体例を示します。

RAファミリ評価ボードのテストプログラム:TPです(プロジェクト名:quickstart_fpb_re6e1_ep)。電源投入後、搭載LEDが点滅し、SW押下げで点滅間隔が変わり、評価ボードの正常性をテストします。

このTPのuser_main部分を抜粋しました。評価ボードにより多少異なりますが、基本動作は同じです。

LED点滅間隔は、無限ループ内のR_BSP_SoftwareDelay(g_delay)が決めます。このR_BSP_SoftwareDelay処理中は、MCUを独占するため、他の処理はできません(割込み処理は除く)。

MCUの並列処理は、RTOS利用が常套手段ですが、RTOS理解やベアメタル比大きな処理能力とRAMが必要です。

そこで、RTOSを使わずにベアメタルで並列処理をするため、LED点滅を時分割処理し、空き時間に別処理を実行するのが、テンプレートの仕組みです。

テンプレートの仕組み
テンプレートの仕組み

サンプルコード課題の原因

サンプルコードの構造は、基本的な「初期設定」+「無限ループ処理」です(基本のキ:組込み処理参照)。

この構造で、①内蔵周辺回路の初期設定 → ②周辺回路の監視(時間消費も含む)→ ③監視結果の処理実行を行います。②と③を、無限ループ内で繰返します。

①初期設定と③結果処理は、開発アプリケーションへそのまま流用ができます。問題は、結果処理以外の無限ループ内が全て監視(時間消費)になる点です。監視中は、他の処理はありません。

つまり、周辺回路のMCU「専用」利用例という訳です。専用ですから、監視結果の処理実行が有ろうが無かろうが問題はありません。

ところが、1つの無限ループ内へ、単純に別周辺回路の「②監視と③結果処理」を入れると、無限ループは、周辺回路「専用」から「共用」へ変ります。

共用する他の周辺回路の監視結果処理の実行有無に応じて、もう1つの周辺回路の監視結果起動間隔も変わります。起動間隔が変わっても問題ない場合もありますが、多くの場合、問題でこれが課題です。

例えば、ウオッチドックタイマ定時リセットや、前章のLED点滅間隔などです。

共用無限ループ内の別サンプルコード処理有無により、当該サンプルコード処理間隔が変わるという問題は、開発初心者には簡単に解決できない大きな壁:課題です。

FSPサンプルコードが重要な訳

FSP構成とGUI設定の様子
FSP構成とGUI設定の様子

RAファミリ共通のHAL API生成ツールがFSPです。FSPのBoard Support Package (BSP)とHardware Abstraction Layer (HAL)Driversが、評価ボードとRA MCU差を隠蔽し、RAファミリ共通APIをGUIで生成します。

Boardは、評価ボードを指しますが、ユーザ独自開発ボードでも、BSPだけを変更すれば、評価ボードを使って開発したソフトウェアが、そのまま独自開発ボード上でも動作します。

つまり、FSPは、プロトタイピング開発に適したツールです。RAファミリアプリケーションの早期開発ポイントは、FSP活用です。但し、FSPソフトウェア開発者は、知っておくべき作法があります。

例えば、2章で示したGPIO制御前後のR_BSP_PinAccessEnable()やR_BSP_PinAccessDisable()などです。これらは、BSP GPIOレジスタの電圧レベルアクセス制御許可/禁止を設定します。

仮に、R_BSP_PinAccessEnable()をコメントアウトすると、ビルドは成功しますがLEDは点滅しません。ワーニングなどもありませんから、作法を知らないと点滅しない原因は、まったく不明になります。

これらは、GPIOアクセスとセットで知るべき作法です。このような作法は、分厚いFSPユーザマニュアルのどこかに記載されているハズですが、ルネサスエキスパートが提供するサンプルコードからセットで抜き出し、そのまま利用する方が簡単です。

※BSP GPIOアクセスの代わりに、上記許可/禁止追記不要なHAL GPIOアクセスもあります。コレも作法の1つです。

また、ルネサス独自内蔵周辺回路:イベントリンクコントローラのサンプルコードなども、同一MCUコア利用の競合他社差別化に役立つかもしれません。
※イベントリンクコントローラは、MCUを介さずに周辺回路間の連携動作が可能なハードウエア。

マニュアルよりもサンプルコードを読み、評価ボードで試す、“習うより慣れよ” です。

FSPサンプルコードは、このような作法や差別化ヒントが詰まった宝庫です。RAファミリアプリケーション開発には、必読書です。

FSP開発例はコチラ、評価ボードサンプルコードは、コチラの関連投稿も参照ください。

テンプレートメリット

本稿では、しばしば “そのまま” という太字キーワードがでてきます。MCUアプリケーション開発は、ベンダ公式サンプルコードが、そのまま利用・活用する部分と、開発者が “工夫を加える部分” とを、素早く見極める目:Know-howも必要です。

Know-how獲得には、弊社テンプレートとMCU評価ボード+Baseboardが、お役に立てると思います。テンプレートもアプリケーションの1つなので、テンプレートへ追記した豊富な日本語コメントで、そのまま流用している部分と、工夫を加えた部分がソースコード上で確認できるからです。

テンプレートを活用し、アプリケーションをプロトタイピング、次ステップでプロトタイプアプリをチューニングし、完成度を上げます。

プロト目的は、アプリ早期開発、この目的に、ベンダ公式サンプルコード流用・活用と弊社テンプレートを利用します。

既製品の流用・活用・利用は、物足りなく感じる方もいるかもしれません。しかし、弊社テンプレートは、チューニング時、開発者が工夫を追加できる余地がいくらでもあります。アプリ完成度向上には、ご購入者独自の工夫も大切ですので、ご安心ください😁。