ARM基板向けのプログラムをシミュレーションで動作確認 ―― Interface 2009年5月号付属基板を一足先に体験
5.ブレークとステップ実行
実際のプロセッサでは実現困難なデバッグ方法の一つが,プログラムのブレークとステップ実行です.シミュレータは,ソフトウェアの上で,プロセッサの動作を逐一模倣しているにすぎませんから,比較的簡単に,好きなタイミングで動作を停止できます.また停止された状況から,1ステップごとにプログラムを実行させることもできます.
実際のプロセッサでは動作が早すぎて発生しても追いかけにくいバグや挙動が不審な動作も,シミュレータで時間を止め,レジスタなどのプロセッサ内部の情報をゆっくりと調査できるため,問題の解決を早めることができます.
●命令に対するブレーク
VPAでは,アセンブラの命令列の各行に対してブレークポイントをセットできます.プログラムは,ブレークポイントのセットされたアドレスの命令を実行する直前に,一度動作を停止します.指定した命令行にブレークポイントをセットする手順を下記に示します(図19).
(1)セットしたい行で右クリックし,コンテクスト・メニューを開く
(2)メニューから「Set Breakpoint」を選ぶ
ブレークポイントを正しくセットできると,その行の左にあるBPの列に停止の赤いアイコンが表示されます.
[図19] 命令行に対してブレークポイントをセットする
一方,セットしたブレークポイントを削除するためには,
(1)セットしたい行で右クリックし,コンテクスト・メニューを開く
(2)メニューから「Remove Breakpoint」を選ぶ
という手順を実行します.BPの列に表示された停止の赤いアイコンが消えます.
●データの変化に対するブレーク
VPAでは,データの変化に対するブレークポイントのセットもできます.これはタイマによる特定のレジスタ値の変化などを確認する場合に重宝します.ここでは,タイマの動作の確認を例に,データの変化にブレークポイントをセットして,動作を確認してみましょう.
FirstProjectのmain.cでは,タイマによって定期的に呼ばれる関数IRQ_Handlerの中で,TIMER0_InterruptRegisterに1をセットするように記述されています.このレジスタは,VPAでは,T0IRという名前で表示されています.しかし,ただシミュレーションを実行しているだけでは,シミューレション速度が早すぎてこのT0IRに1が本当にセットされているのかどうか確認することができません.そこで,この値が変化したタイミングにブレークポイントをセットして,本当に値が変化しているのかどうか確認してみましょう.図20に指定したデータの変更時にブレークがかかるようにセットする手順を示します.
[図20] データの変化に対するブレークポイントをセットする
データの変化に対するブレークポイントをセットするためには,
(1)変化をチェックしたいレジスタの個所で右クリックし,コンテクスト・メニューを開く
(2)Create HW Watchpointをクリック
という手順を実行します.正しくブレークポイントがセットされると,停止マークが左側に表示されます.
実際にシミュレーションが止まるかどうか見てみましょう.シミュレーションの開始は今までと同じです.ツール・バーのシミュレーション開始ボタン(音楽プレーヤの再生ボタンみたいなもの)をクリックします.
しばらくすると,プログラムのシミュレーション動作が停止します.停止したかどうかは,ARM7TDMIの「Register View」で見られるcycle_countの値などで確認できます.シミュレーションが停止している場合,この値は変化しません(図21).
[図21] ブレークポイントによって動作が停止しているところ
これにより,T0IRの値は正しく1に変化していることを確認できます.継続してシミュレーションを実行する場合は,再びシミュレーション開始ボタンをクリックするか,あるいは,その隣にあるアイコンをクリックしてステップ実行を行います(図22).
[図22] シミュレーション開始ボタンの右にあるステップ実行ボタン
再びシミュレーションを開始した場合は,次にまたブレークポイントがあるまでプログラムを自動的に実行します.一方ステップ実行の場合には,1ステップだけプログラムを実行できます.特にバグのあるプログラムの動作を確認する場合には,1ステップずつの実行が有用なことが多いでしょう.
※本記事は,Interface 2009年4月号に掲載された記事を一部修正して掲載しています.さらに詳しい記事や関連記事を参照したい方は,Interface 2009年4月号をご覧ください.
関連リンク