Cortex-AとRTOSではじめる組み込みシステム開発

組み込みシステム開発とは

実験室室長の浦邉です。この講座では、Arm® Cortex®-AとRTOSを使って、組み込みシステムのアプリケーションを開発するステップをご紹介していきたいと思います。

今更そんなこと・・・という人もいるかもしれませんが、初めて組み込みシステムの開発をする人も増えてきています(実際に人手は足りないはず!)。しかも、会社の新人研修に時間が取れないという状況も多いと聞きます。また、最近ではIoTの実証実験や導入実績が取り上げられ、これまでの組み込みシステムのエンジニアだけでなく、クラウド系のソフトウェアエンジニアが組み込みシステムを触る機会も増えています。しかも、ものすごい勢いで。

現在、Arm Mbed™やArduino、Raspberry Piなど、プロトタイピングには十分すぎる環境が整っています。これらを駆使して様々なシールドを積み重ねるだけで、安価に組み込みシステムを構築することが可能です。でも!そこで終わらせられないのが、ビジネスの現場における組み込みシステム開発だと思うのです。

通常、RTOSを使用した組み込みアプリ開発は、多くの事前準備が必要になります。使用するPCはもちろんのこと、対象となるハードウェア、RTOS、デバッガも必要になります。さらに、デバイス専用のBSP(ソフトウェアやドライバ)も用意する必要があります。無償のものを使うこともあれば、有償で1パッケージになっているものまで、形態は様々です。特に、RTOSを使用したデバッグでは、「デバッガなし」という選択は効率も悪く、短期間の開発ではあり得ないと言っていいと思います。Linuxのアプリ開発だけであれば、デバッガなしでもいいかもしれませんが、printfデバッグに頼らざるを得ないのではないでしょうか。

Cortex-Aを使ったシステムは、Linuxを使うケースも多いですが、Linux以外のOSを使用する場合はRTOSを使うことがほとんどではないでしょうか。OSを使わないケースもあると思いますが、Cortex-Aの性能を引き出すにはそれなりの設定が必要で、アーキテクチャの知識は欠かせません。Cortex-A関連のセミナーの人気ぶりや、APS-WEB内の Cortex-A編 も人気コンテンツであることが現状を物語っています。いつまでもMMUの設定やキャッシュの設定を避けていたのでは、マイコンとの差は出てきませんからね。

ちなみに今回の講座は、C言語での使用実績がある方を最低条件にしていますので、その点はご理解いただければと思います。Cortex-A、RTOSの詳細については、Cortex-A編RTOS編 で復習してください。

SOLIDとは

開発環境は、京都マイクロコンピュータ社(以下、KMC)からリリースされた「SOLID」を使用します。今回使用するSOLID Starter Kit for RZ/A1Hは、評価ボード、デバッガ、IDEなどが、すぐに使えるAll in One Packageになっています。それぞれについて、簡単に紹介します。もっと詳しく知りたい方は、SOLIDサポートサイトを見てください。

図1SOLID Starter Kit for RZ/A1H

スタータキット付属CPU評価ボード

ルネサスエレクトロニクス社のRZ/A1Hを搭載したアルファプロジェクト社製の評価ボードです。USBからの給電ができるようになっています。ボードとPCをつなぐUSBケーブルは別途用意してください。

ボードの仕様
  • 搭載SoC
    Renesas RZ/A1H(R7S721000VCFP)
  • コア
    Arm Cortex-A9 NEON搭載400MHz
  • ボード
    AP-RZA-1A-KM、RAM10Mbyte(CPU内蔵のみ)
    SPI-FLASH 4Mbyte、5V USBバスパワー給電
    アルファプロジェクト社製(アルファプロジェクト社製各種オプションボード利用可能)
  • BSP
    タイマ、シリアルコンソール、SD、SPIフラッシュ、Ethernet、TCP/IP、FAT-FS、フレームバッファ、液晶出力、JPEGデコーダ他

デバッガ

Visual Studioベースのデバッガを採用しています。デバッグエミュレータには、KMCのPARTNER-Jet2がバンドルされています。組み込みシステムのアプリケーション開発には、最適なJTAG-ICEです。PCとはUSBケーブルで接続します。SOLID-IDEのUSBドングルとしても機能するので、ビルドする際には常に接続しておく必要があります。

SOLID-OS

SOLID-OSには、μITRONベースのRTOS「TOPPERS/ASP3」を採用しています。コンパクトで、省電力性に優れたティックレスカーネルを採用。μsecオーダの時間管理が可能です。静的生成と動的生成をサポート。SOLID-IDEと密接に連携しているため、スタック解析はもとより、システムコールのトレースやRTOSの資源表示、タスクの状態や変数の状態もIDE上に表示します。

SOLID-IDE

SOLID-IDEは、Visual Studioベースの統合開発環境で、エディタ、コンパイラ、デバッガが含まれており、マイクロソフト社のVisual Studioを別途購入する必要がありません。SOLID-IDEはバックグラウンドでコンパイルしてくれるエンジンを搭載しているため、ソース編集時でも警告をしてくれるので、コード入力効率が格段に向上します。また、IDEの専用デバッガは、自動変数表示やブレークポイントの設定はもちろん、例外発生箇所の特定やSOLID-OSのタスクの状態も表示します。それ以外にも多くの機能があるので、ご紹介します。

Arm Cortex-Aのメモリ管理機能(MMU)

RZ/A1HをはじめとするCortex-Aを搭載するデバイスには、MMUが搭載されています。このMMUを有効にすることで、より高いCPUコア性能を引き出すことが可能です。注目すべきは、仮想アドレスと実アドレスを変換するMMUの設定状態がわかるMMUマップレイアウト機能や、セクションに応じたプロテクション設定が行える点です。これにより、不用意にメモリに書き込むことを防止し、プログラムコードやデータ領域を守ることができます。しかも、実機に連動したリンカスクリプトとMMU初期化コードが連携しているため、設定が面倒なCortex-AのMMU設定が簡単に行えるなど、初心者にもやさしい仕様になっています。

静的解析ツール

ビルド時に、SOLID-IDEから簡単に使用できるソースコード静的解析ツールです。静的解析ツールは、変数の未初期化部分、分岐条件、ゼロ除算、未初期化ポインタへのアクセスなどを事前に指摘してくれる機能です。

動的解析ツール「アドレスサニタイザ」

SOLID-IDEから簡単な設定で使用できる動的解析ツールです。実行時に問題となる不正なメモリアクセス、オーバーランや未定義領域へのアクセスを自動的に検出する機能です。

ELFローダー

SOLIDには作ったプログラムを実機にロードするためのベアメタルローダーを備えています。大容量のプログラムを高速でロードできるだけではなく、モジュール単位のロードもできるという特長があります。

実際に組み込みアプリを開発してみる

前段が長くなりましたが、今回の講座では、実際にCortex-AとRTOSを組み合わせた例として、本格的な組み込みアプリを開発していきます。開発するアプリケーションは、「データロガー」とします。

データロガーは、ひたすらデータを取り続けるものですが、用途は多く、さまざまなFA機器にも使われています。最近はネットワークに接続して、クラウドに保存するタイプもありますが、FA機器内に組み込んで様々なログを取ることはまだまだ多くあります。そんなデータロガーを、今回の講座で構築していきたいと思います。

さて、アプリも決まった。ハードも決まったとなれば、どのようにソフトウェアで実現していくかということになります。

RTOSを使う開発

まずは、OSを使うかどうか?という点が、最大の悩みどころかもしれません。あえて、RTOSを使うという選択をしたからには、効率よく設計していきたいですよね。そうなると、μITRON系は組み込みシステムのRTOSとして申し分ない性能を持ち合わせており、日本語による資料なども豊富に用意されています。しかも、SOLIDにはμITRON準拠の Toppers が同梱されています。これを使って組み込みアプリ開発をするのが最適です。

RTOSを使わない開発

ちなみに、RTOSを使わないとした場合にどんなことが待ち受けて入るかというと、処理を関数でまとめることは似ていても、割り込みの面倒を自分で見ないといけないとか、本来なら無駄な待ち時間を使用したり、割り込み許可・割り込み禁止を考慮して、自分で考えながらコードを書いていかなければいけないなど、実はちょっと面倒だったりします。

カーネルのオーバーヘッドを理由に拒む理由もわからなくはありませんが、Cortex-Aが400MHzで動作した時のオーバーヘッドってどのくらいでしょう?いろいろ試してもらえればいいと思いますが、通常のレジスタセットであれば16個のCPUレジスタを退避させる時間、16個のCPUレジスタを読み込む時間、そのほかのレジスタの操作、OSとしての処理時間。1クロックあたり2.5ns、トータルのクロック数にしても、それほど多くの命令を実行はしないです。

カーネルにもよりますが、タスク切り替えに要する時間はおそらく1μs以下でほぼ完結します。FPUを使用すると、FPUレジスタが32個ありますので、汎用のCPUレジスタと比べると、レジスタの操作が増えた分時間は要しますが、特別遅くなると言うほどではありません。カーネルやアプリケーションの組み方にも依存しますが、リアルタイム系のOSでカーネルのオーバーヘッドが大きくて使えないという理由は、2017年現在のラインアップから考えると、よほど時間的にクリティカルなものでなければ、RTOSを使わない理由はないと断言してもいいと思います。

しかも、アプリ開発する際、OSなしは面倒なだけでなく、その後のメンテナンスにも大きく影響します。ここまで長くなりましたが、断言します。

OSを使いましょう。

組み込みアプリ開発の仕様

これから開発する組み込みアプリの例として、Cortex-AとRTOSの有効性を最大限生かしたいので、下記のような仕様とします。

要件

  1. RZ/Aの内部にあるADCのデータを10MHzの間隔でサンプリング。
  2. 取得したデータを100サンプル毎に平均化。
  3. 平均化したデータをUARTに出力。
  4. ストップボタンが押されたら、すべてのタスクをストップ。
  5. スタートボタンが押されたら、すべてのタスクをスタート。
  6. ボタンが押された時は、UARTにメッセージを出力。
  7. UARTからの入力は、時刻の設定のみ。
  8. 1分毎に、現在の時間を表示。
  9. 一定時間以内でWDTを更新。
  10. WDTが更新されなかった場合、システムをReset。

ハードウェアのポイント

  • UARTは、入力と出力
  • ADCは、1ch / 1MHzサンプリング
  • GPIOは、2ポート
  • RTCは、時刻設定
  • WDTは、暴走監視

起動方法の検討

  • SDカードからブートさせるか、オンボードのフラッシュROMからブートさせるか?
  • フラッシュの種類はSPIか?QSPIか?

起動方法は、今後決めていかなければいけない点です。

次回からは実際に開発していく過程と、開発のポイントや注意事項などを交えて、動画とテキストで組込みシステム開発を学んでいきたいと思います。それでは次回もお楽しみに!