メモリとレジスタをセーブ/リストアする C-SPYマクロ
テクニカル・ノート 24166
アーキテクチャ:
All
コンポーネント:
debugger
更新日:
2018/08/08 5:21
はじめに
デバッグ効率を上げるためにメモリやレジスタをターゲットに保存する必要がある場合、本テクニカルノートが役に立ちます。ここではFreescale 6812の例について説明しますが、この例は、適宜変更を加えることで他のチップでも有効です。
このサンプルマクロファイルには、レジスタや一連のメモリセルをシンプルなHexファイルに保存する方法が示されています。ここでは、「c:\test.hex」という名前のファイルを使用しますが、どのような名前のファイルを使用しても構いません。ただし、保存時と復元時では同じファイル名を使用してください。また、作業を簡単にするため、このファイルをプロジェクト(Project) > オプション(Options) > C-SPY > セットアップファイル(Setup file)で指定して、C-SPYを起動するたびにこのファイルが読み込まれるようにしてください。その後、表示(View) > クイックウォッチ(Quick Watch)からこのマクロを呼び出してください。それには、マクロの名前だけを指定して(例:memory_save())、Enterを押すか、再計算(Recalculate)をクリックします。ウォッチを追加すると、ウォッチが更新されるたびにこのマクロが実行されるため、ウォッチに追加(Add Watch)は選択しない方がよいでしょう。
では、このサンプルを少し詳しく見ていきましょう。まず、このファイルの先頭で、変数がいくつか定義されています(これらの変数は、クイックウォッチのダイアログでも確認できます)。その中で最も注目すべき変数は、mem_beginとmem_endですが、この2つの変数は、保存・復元するメモリ範囲の指定に使用します。この2つの変数では、複数の範囲指定を行うのも簡単です。
次に、メモリ保存関数が定義されています。
- ファイル(C:\test.hex)を書き込み可能で開きます。
- レジスタの値がレポートウィンドウに表示されている状態で、レジスタの値をファイルに保存します。
- mem_beginとmem_endをファイルに保存します。
- mem_beginとmem_endの間にあるメモリの内容を保存します。
このサンプルには、以下のようにコメントアウトされた行が含まれています。
// Optional register:
これは、必要なときに限り(バンキングを使用する場合など)、PPレジスタを保存/復元するためのものです。メモリ読み取り関数では、基本的にこれと逆のことを行います。全く複雑なものではありません。
最後に、execUserSetup()が定義されています。この関数では、mem_beginとmem_endが定義されます。この名前のマクロが存在する場合、ターゲットプログラムがダウンロードされたときに、このマクロが1度だけ呼び出されます。他の同様なマクロについては、C-SPYのドキュメントを参照してください。
別のマクロ
ファイル名を指定できるマクロが定義された別のサンプルが用意されています。このマクロを使用すれば、マクロのソースを変更する必要がありません。
バイナリ形式で変数の内容をダンプするコマンドをQuickWatchのコマンドラインで入力する例:
DumpMem("dumpmem.bin", &trace_buffer, sizeof(trace_buffer))
可読形式でARMレジスタの内容をダンプするコマンドをQuickWatchのコマンドラインで入力する例:
DumpReg("dumpreg.txt")
DumpRegに関する注記
対象アドレスに対してint型のサイズが小さすぎる場合、int型ではなくlong型へのキャストを試してください。
全ての製品名は、それぞれの所有者の商標または登録商標です。