バックナンバーはこちら

today&tomorrow

Technology Update

2018 vol.110

バーチャル・プロトタイプを使用した組込みソフトウェアのデバッグ

カーネル・レベル・ソフトウェアおよびペリフェラルのデバッグ

ここまでは、バーチャル・プロトタイプのアセンブリ・レベル・デバッグと簡単なブレークポイントを使用して、実行が無限ループで止まっていることを突き止めました。更に詳しく調べるために、使い慣れたソフトウェア・デバッガ(Lauterbach TRACE32)を接続し、カーネルの実行が止まっている理由を調べてみます(図14)。

画像

図14:カーネル・レベル・ソフトウェアのデバッグ

ここではデバッガはいわゆるストップ・モードで動作し、システム全体の動作が中断します。タイマーやクロックなどもすべて動作が中断されるため、ソフトウェア自身は実行を停止していることを認識しません。今回の例では、実行がwhileループで止まっていることがデバッガで確認できます。このwhileループは、内部カウンタticksが初期値jiffiesから変化するのを待っています。しかしループ内ではカウンタに対する操作が何も行われていません。このため、別のOSコンテキスト(プロセス)でステートを変更し、ループを抜けるようにする必要があります。

まず、カーネルが割り込み処理を実行していないことがLinux動作コンテキストのトレース・ログ(図15)から確認できます。

画像

図15:カーネル・スレッドおよび関数のトレース

割り込み処理が実行されていれば、コンテキスト・トレースに割り込みハンドラの行が存在するはずです。割り込み処理が実行されていないとすれば、次にタイマが割り込みを正しく発行しているかどうかを調べる必要があります。この情報は、バーチャル・プロトタイプを使用すると簡単に取得できます。図16に示すように、通常では見ることのできないタイマ・ペリフェラルの内部が完全に可視化されます。

画像

図16:タイマ・ペリフェラルのデバッグ

タイマ割り込み信号に信号ウォッチポイントを設定すると、タイマから割り込みが発行されていることをすぐに確認できます。これで、タイマの動作が正しいことは確認できました。この他、タイマ・モデルからはモードとステートに関する情報も得られます。ここでは、モードが「PERIODIC」、ステートが「RUNNING」と表示されているため、タイマーが正しくプログラムされていることが確認できます。

次に、割り込みコントローラがタイマ割り込みに対してどのような処理をしているかを調べます。バーチャル・プロトタイプでは、割り込みコントローラ信号とレジスタも可視化できます(図17)。

画像

図17:割り込みコントローラのステータス

割り込みコントローラのレジスタを調べると、RAW割り込みレジスタVICRAWINTRがタイマ割り込み0x10(= 0b10000。ビット4がセットされているのは割り込みライン4の意味)を受信していることが分かります。しかし割り込みステータス・レジスタVICFIQSTATUSは0のままです。割り込みイネーブル・マスク・レジスタVICINTENABLEを見ると、タイマ割り込み4が有効になっていないことが分かります(有効ならば0x80000020ではなく0x80000030のはずです)。つまり、割り込みイネーブル・マスクがカーネルによって誤って初期化されたか、何らかの誤ったコードによって上書きされた可能性が考えられます。このように、バーチャル・プロトタイプで得られるペリフェラルのレジスタおよび信号に対する可視性により、割り込みコントローラの設定に誤りがあることを突き止めることができました。

ハードウェア-ソフトウェアのトレース

バーチャル・プロトタイプには、ソフトウェア・デバッガとバーチャル・プロトタイプ・アナライザを使用してシステムのステートを調べる以外に、もう1つの非常に便利な機能があります。それはハードウェアとソフトウェアのアクティビティをトレースする機能で、これによりハードウェアとソフトウェアの連携を俯瞰的な視点から簡単に可視化できます。図18は、割り込みコントローラおよびタイマのコンフィギュレーションとソフトウェアをトレース・ビューで表示したものです。一番上には割り込みコントローラのレジスタが表示されています。その下の「Status Trace」欄にはタイマのステータスに関する情報が表示されています。これを見ると、タイマのレジスタがプログラムされた時点(3番目のトレース)でタイマのステートが「FREE_RUNNING」から「PERIODIC」へと正常に変化していることが分かります。関数呼び出しのガント・チャートには、対応するカーネル・ソフトウェア関数が表示されています。

画像

図18:タイマおよびタイマ割り込みコンフィギュレーションのトレース

このトレースを使用すると、遅延ループのキャリブレーション中、割り込みを受信してからタイマ割り込みハンドラまでの一連のアクションによってタイマ・レジスタが周期的にプログラムされていることが分かります(図19)。

画像

図19:タイマおよびタイマ割り込み処理のトレース

カテゴリートップ