組み込みアプリを止めるな!printfやブレークポイントも使わず内部状態をチェック!

産業機器、オーディオ製品、通信デバイスをはじめとする多くの組み込みアプリケーションは、わずかなタイミングの違いで動きが変化します。そのため、開発・検証のためにprintfなどを仕掛けることが難しく、開発効率が伸び悩むケースも増えています。そこで今回の実験室では、システムを止める事なく内部状態を取得できるデータ計測ツール「EVRICA」を紹介いたします。組み込みアプリケーションの開発や検証に欠かせない、新しい開発ツールです。

止めることができない、組み込みアプリケーション

組み込みアプリケーションの開発現場では「システムの動きを止めずに、内部状態を取得し、開発や品質保証に活用したい」という声が高まっています。

1ms未満のジッタすら許されないアプリケーションを、いかに解析するか

ロボットアームなどのFA機器、LoRa/BLEなどの通信機器、映像機器やオーディオ機器といった最先端の組み込みアプリケーション。これらを制御するマイクロコントローラには、高速な動作のみならず、1ms未満のジッタ(実行時間のゆらぎ)すら許されない精密なタイミング制御が求められています。そのため、組み込みアプリケーションの解析は年々難しさを増しています。

例えば、リアルタイム性が求められる産業用ネットワークシステムを検証する場合、開発者お馴染みのprintfを使うと、UARTの通信速度制約(例:115200bps)により、遅延が発生。システムを厳密に検証できません。もちろん、デバッガのブレークポイント機能を使えば、たちまち通信はタイムアウトしてしまうでしょう。こうした理由から、システムに影響を与えることなく、システムを止めずに解析できる手法が求められています。

図図1:今回の実験に使用した機材。

不具合解析に必要なデータを、いかに正確に収集するか

開発者を悩ませるタイミングバグ。わずかなソースコードの変更が、無関係な機能の実行タイミングを変化させ、不具合が顕在化する現象です。近年の組み込みアプリケーションには、オープンソースをはじめとする既存の開発資産が多数流用されているため、ひとたびタイミングバグが発生すると、原因の特定は非常に困難です。タイミングバグの解決には、実行タイミングを変えずに、不具合の発生した時点の内部状態を正確に収集する必要があります。

情報を収集するための工数を、いかに抑えるか

printfを使った開発では、情報を収集する工数を知らず知らずのうちに浪費しがちです。例えば不具合を修正する場合、原因を推定・仮定し、対応する情報が格納されているアドレスを調べ、表示するためのprintfを挿入。ビルドし直して、不具合が発生するまで実行。printf出力を解析し、ようやく情報を入手できます(下図)。実際の現場では、必要な情報にたどり着くまでに、何回もこのサイクルを実施することも多いでしょう。そのため手間をかけず情報を収集できる仕組みが、効率的な開発には欠かせません。

図図2:printfで情報を収集することにより、浪費される工数。

CPUに頼らないデータ計測ツール「EVRICA」

EVRICAは、プログラムに手を入れることなくメモリの内容やハードウェア状態を収集できる「データ計測ツール」です。EVRICAは、Arm® Cortex®-A/Cortex-R/Cortex-Mに搭載されている「CoreSight」というハードウェア機能を活用し、CPU上で動くプログラムと独立して最高25MHzで内部状態を収集できます(二個目のCPUのように振舞うことができます)。EVRICAはArm Cortexの基本的なハードウェア機能のみを利用するため、数多くのメーカーがリリースしている様々なシステムや評価ボードに接続することができます。今後も対応機種は増えていくでしょう。

EVRICAの特長とは!

EVRICAの製品コンセプトは、次の通りです。下図に挙げている、開発に便利な機能を提供します。

  • ユーザプログラムへの改変なし
  • JTAG/SWDからサンプリング可能
  • 最速6.5μs/点の高速データ取得を実現
  • 128点の多チャンネル測定可能
  • 測定データをHDDに長時間記録

図図3:EVRICAの特長。

EVRICAを使って、ロボットを開発しよう

タイミング変化に敏感なロボットアームの内部状態を、EVRICAで可視化してみましょう。ロボットアームは、内部状態の可視化のためにprintfやブレークポイントを使ってしまうと、タイミングが変化し動作が変わってしまうため、従来の手法では内部状態を計測困難なアプリケーションの一つです。実際の様子は動画をご覧ください。

6軸ロボットアームの内部状態を、システムを止めずに取得する

今回は、サーボモータを組み合わせた6軸ロボットアームを使います。制御部はSTM32F4DISCOVERYを使って実装しました。STM32F4DISCOVERYは、STマイクロエレクトロニクス社製STM32F407マイクロコントローラ評価ボードで、Cortex-M4Fを内蔵し、サーボモータの角度指定に使えるPWM波生成用ハードウェア(TIMx)を搭載しています。

図図4:ロボットアームの制御部(上面)。

図図5:ロボットアームの制御部(側面)。

制御部の回路を下図に示します。EVRICAを接続するための2.54mm 20pinのSWDコネクタを搭載しています。また、EVRICAによる内部状態の取得と、printfによる内部状態の取得を比較するため、USB-UARTポートも搭載しています(比較結果は動画をご覧ください)。

図図6:制御部の回路図(PDF)。

EVRICAをセットアップする

EVRICAの操作は、とても簡単です。以下の、わずか5個の手順しか必要としません。なお、インストール方法や各種設定方法、取得したデータの解析方法の詳細を知りたい方はEVRICA同梱のPDFマニュアル(フルカラー)をご利用いただけます。

  • EVRICAとPCを繋ぎ、電源を投入し、ターゲットシステムと接続。
  • 「MPU固有設定」を行う。
  • ウォッチする「アドレス変数」を指定する。
  • 計測を開始する。
  • 「波形グラフ」、「変数ウォッチ」で計測結果を可視化する。

ケーブルを接続する

まず、EVRICAとPCをUSBで接続し、EVRICAとターゲットとなるシステム(今回はロボットアームの制御部)をArm JTAG/SWD 2.54mm 20pinケーブルで接続します。1.27mm 10pin/20pinのJTAG/SWDコネクタ用の接続ケーブルもDTSインサイトから提供されています。

図図7:EVRICAとターゲットシステムの接続。

ターゲットハードウェアを設定する(MPU固有設定)

次に、ターゲットとなるハードウェアを指定する「MPU固有設定」を行います。今回は、STマイクロエレクトロニクス社製のCortex-M4搭載システムがターゲットとなるため、メーカー「Other」、SoC「SoC Cortex-M」、コア「Cortex-M4」を選択します。本設定により、詳細設定にあるインターフェース「SWD」や通信周波数「17MHz」が自動的に生成されるため、手動での詳細設定は特に必要ありません(なお今回の実験では、さらに高速にデータを収集するため、通信周波数を「25MHz」に設定しました)。

図図8:MPU固有設定画面(STM32F4DISCOVERY用)。

データ計測対象となるアドレスを指定する

続いて、データ計測したいメモリアドレスを設定します。今回の動画では、STM32F4DISCOVERY内のPWM生成用ハードウェアのアドレス0x40000000〜0x40000050を設定しました。グラフには、PWMの基本周期となる0x40000024(TIM2_CNT)と0x40000038(TIM2_CCR3)を表示しています。各レジスタの詳細についてはSTM32F407の仕様書をご参照ください。

図図9:アドレス変数の登録画面(STM32F4DISCOVERY用)。

システムの内部状態を計測し、可視化する

最後に「計測ボタン」をクリックするとシステムの内部状態を計測できます。従来のデバッガでは、登録したアドレス変数の値を見るにはブレーク(CPUの一時停止)が必要でしたが、EVRICAはシステムを止める事なく、最高25MHzで最新の内部状態を取得、表示できます。

波形として表示する

「波形グラフ」機能を使うことで、時間軸方向の値の変化を見ることができます。今回は、サーボモータの角度を決めるPWM波生成用の基本クロック値(下図上)と、PWM波のデューティ比を決めるための閾値を(下図下)表示しました。EVRICAは最大32本の波形を同時に描画できます。

図図10:波形グラフ機能。

変数ウォッチにて値を表示する

「変数ウォッチ」機能を使うことで、各アドレスに格納されている最新の値を見ることができます。16進数表示はもちろん、符号付きの10進数表示や、ビットマスクや倍率を掛け合わせた加工値を表示することもできます。また、最小値と最大値も表示されるため、異常な範囲の値を取っていないかの確認や、波形グラフを表示する際の縦軸の目安に使うこともできます。

図図11:変数ウォッチ機能。

EVRICAのさらなる特長

今回紹介した以外にもEVRICAには開発に便利な、下記の機能が含まれています。是非ご活用ください。

  • プログラムへの変更は一切不要
  • 活線挿抜にも対応
  • 同時32ch波形表示、同時128ch変数表示
  • トリガ機能
  • 測定値を加工して表示する機能
  • 経過時間計測機能
  • メモリライト機能
  • 計測データ保存機能
  • 計測を自動化するスクリプトも設定可能

まとめ

デバッガでブレークポイントを設定したり、printfを挿入したりといった従来のソフトウェア開発手法は、検証の度に大きな工数が必要でした。また、これらの手法ではタイミングバグを正確に調査することは困難です。EVRICAは、こうした開発者の悩みから生まれた「DTSインサイトならでは」の開発ツールです。システムを止めずに解析できる新しい手法を、最新の組み込みアプリケーション開発へ是非ご活用ください。