ソフト

組み込みソフトのデバッグ手法、JTAGデバッガとprintfデバッグの使い分け

組み込みソフトのデバッグ手法、JTAGデバッガとprintfデバッグの使い分け

組み込みソフトのデバッグ手法、JTAGデバッガとprintfデバッグの使い分け

組み込みソフトの開発において、デバッグは避けて通れない工程です。特に、ハードウェアとソフトウェアが密接に絡み合う組み込みの世界では、問題の切り分けや原因特定が複雑になりがちです。プログラムが想定通りに動作しないとき、どこに問題があるのか、どのように状態を把握すれば良いのか、頭を悩ませる技術者は少なくありません。

このコラムでは、組み込みソフトのデバッグでよく用いられる「JTAGデバッガ」と「printfデバッグ」の二つの手法に焦点を当て、それぞれの特徴、設定のポイント、そして実務における効果的な使い分けについて解説します。

組み込みソフトのデバッグが難しい理由

パソコン上のアプリケーション開発と異なり、組み込みソフトは特定のハードウェア上で動作します。そのため、デバッグの際には以下のような課題に直面することがあります。

  • ハードウェア依存の問題: マイコンの初期化、周辺回路との通信、電源管理など、ハードウェアの不具合が原因でソフトウェアが正常に動作しないケースがあります。
  • リアルタイム性の要求: センサーからのデータ処理やモーター制御など、時間的な制約が厳しい処理では、デバッグツールを接続するだけで挙動が変わってしまうこともあります。
  • リソースの制約: メモリやCPUリソースが限られているため、デバッグ用のコードやデータを追加することで、本来の動作に影響を与える可能性があります。

これらの課題を解決するためには、状況に応じたデバッグ手法を選ぶことが重要です。

JTAGデバッガを使ったデバッグの基本

JTAG(Joint Test Action Group)は、もともと基板のテストのために考案された規格ですが、組み込み開発ではマイコンのデバッグインターフェースとして広く利用されています。JTAGデバッガは、ターゲットとなるマイコンに接続し、プログラムの実行を制御したり、内部の状態を詳細に確認したりする強力なツールです。

JTAGデバッガでできること

JTAGデバッガを使うと、次のようなデバッグ作業が可能です。

  • ブレークポイントの設定: プログラムの特定の行で実行を一時停止させ、その時点の変数の値やレジスタの状態を確認できます。
  • ステップ実行: プログラムを1行ずつ、または関数単位で実行し、処理の流れを詳細に追跡できます。
  • レジスタ・メモリの参照と変更: マイコン内部のレジスタや、プログラムが使用しているメモリの内容をリアルタイムで確認・変更できます。
  • プログラムの書き込み: 開発中のプログラムをターゲットマイコンに直接書き込むことができます。

これらの機能は、特にプログラムが起動しない、意図しない挙動をする、ハードウェアとの連携に問題があるといった、低レベルな部分のデバッグに威力を発揮します。

主要なJTAGデバッガツールの設定

市場には様々なJTAGデバッガツールがありますが、代表的なものとその設定のポイントを紹介します。

  • OpenOCD (Open On-Chip Debugger):

オープンソースで提供されており、多くのマイコンやデバッガプローブに対応しています。設定は、ターゲットマイコンの種類やデバッガプローブに応じた設定ファイル(.cfgファイル)を編集して行います。初期設定はやや複雑に感じられるかもしれませんが、柔軟性が高く、カスタム環境を構築しやすいのが特徴です。

  • J-Link (SEGGER社製):

SEGGER社が開発する高性能なデバッガプローブで、ARM Cortex-M系のマイコンを中心に幅広い製品に対応しています。専用のソフトウェア(J-Link GDB Serverなど)と組み合わせることで、直感的で安定したデバッグ環境を提供します。設定はGUIから行うことが多く、比較的容易です。

  • PEMicro (PEMicro社製):

主にNXP(旧Freescale)製のマイコンに強く、NXP製の開発環境(MCUXpresso IDEなど)に統合されていることが多いです。専用のデバッガプローブを使用し、こちらも比較的容易に設定できます。

これらのツールは、JTAGインターフェースだけでなく、SWD(Serial Wire Debug)インターフェースにも対応していることがほとんどです。接続する際は、ターゲット基板のデバッグポートとデバッガプローブを正しく接続し、開発環境側で適切なドライバと設定を選択する必要があります。

printfデバッグの活用

JTAGデバッガが強力な一方で、手軽にプログラムの動作状況を確認したい場合や、複雑なロジックの流れを追跡したい場合には、「printfデバッグ」が有効です。これは、プログラムの途中にprintf関数などのログ出力関数を挿入し、特定の変数の値や処理の通過状況を外部に出力して確認する手法です。

UART(シリアル通信)を使ったログ出力

最も一般的なprintfデバッグの手法は、UART(Universal Asynchronous Receiver/Transmitter)を使ったシリアル通信によるログ出力です。

マイコンのUARTポートをPCのUSBシリアル変換ケーブルなどを介して接続し、PC側のターミナルソフトウェアでログを受信します。

メリット:

  • 特別なデバッガプローブがなくても、安価なUSBシリアル変換モジュールがあれば利用できます。
  • プログラムの実行速度への影響が比較的少ないです。
  • 量産後の製品でも、デバッグポートが残っていればログを採取できる場合があります。

デメリット:

  • マイコンのUARTポートをデバッグ用に占有します。
  • ログ出力の速度はボーレートに依存し、大量のログを出力すると処理が遅延することがあります。
  • printf関数はメモリを消費し、実行ファイルサイズも増加します。

セミホスティングを使ったログ出力

セミホスティングは、デバッガプローブを介してPC側にログを出力する手法です。ターゲットマイコン側で特定のシステムコール(例: SWI命令)を呼び出すことで、デバッガがその処理を捕捉し、PCのコンソールにログを表示します。

メリット:

  • UARTポートを占有しないため、他の通信に利用できます。
  • デバッガが接続されていれば、特別なハードウェアは不要です。

デメリット:

  • デバッガが接続されていることが前提となります。
  • ログ出力のオーバーヘッドが大きく、実行速度に影響を与えることがあります。

RTT(Real Time Transfer)の活用

SEGGER J-Linkデバッガを使用している場合、RTT(Real Time Transfer)は非常に強力なprintfデバッグの選択肢となります。これは、ターゲットマイコンのSRAM領域をバッファとして使用し、J-LinkデバッガがそのSRAMを直接読み書きすることで、高速かつリアルタイムにログデータをPCに転送する技術です。

メリット:

  • 非常に高速なログ出力が可能で、プログラムの実行速度への影響が最小限に抑えられます。
  • UARTなどの通信ポートを一切占有しません。
  • 双方向通信も可能で、PCからコマンドを送信してターゲットの動作を制御することもできます。

デメリット:

  • SEGGER J-Linkデバッガと、それに対応したターゲットマイコン、そして専用のライブラリの組み込みが必要です。
  • SRAMの一部をバッファとして消費します。

JTAGデバッガとprintfデバッグの使い分け

これら二つのデバッグ手法は、それぞれ得意な領域が異なります。状況に応じて適切に使い分けることが、効率的なデバッグにつながります。

JTAGデバッガが有効なケース:

  • プログラムが全く起動しない、あるいは初期化段階でハングアップする場合。
  • 予期しないハードウェア割り込みが発生している場合。
  • ポインタの誤用によるメモリ破壊など、低レベルなバグを特定する場合。
  • リアルタイム性が求められる処理で、正確なタイミングを確認したい場合。
  • 特定のレジスタ設定が正しいか、リアルタイムで確認したい場合。

printfデバッグが有効なケース:

  • アプリケーション層の複雑なロジックや状態遷移を追跡したい場合。
  • 複数の処理パスの中から、どのパスを通っているかを確認したい場合。
  • 特定の変数の値が、時間経過とともにどのように変化するかを継続的に監視したい場合。
  • 開発の初期段階で、手軽に動作確認を行いたい場合。
  • 断続的に発生する不具合で、発生直前の状態を記録しておきたい場合。

一般に、プログラムの起動やハードウェアに近い部分でのトラブルシューティングにはJTAGデバッガを、アプリケーションのロジックやデータフローの確認にはprintfデバッグを用いるのが基本的な考え方です。特に、JTAGデバッガでプログラムがどこまで実行されているかを確認し、その上でprintfデバッグを併用して詳細な情報を得る、といった連携も有効です。

サイコス・ジャパン株式会社では、機構設計から電子基板、組み込みソフト、クラウド、量産まで、製品開発の全工程を一社で手掛けています。このため、デバッグの段階においても、ハードウェアとソフトウェアの両面から複合的な視点で問題解決にあたることが可能です。当社では、これまで50件を超える製品開発支援の実績があり、試作品の持ち込みから製品化に至るまで、お客様が直面するデバッグの課題解決をサポートしてきました。

製品開発の過程でデバッグに課題を抱えている方は、まずお気軽にご相談ください。

← 技術コラム一覧に戻る
無料相談する