gdbをコマンドラインから使う時に便利なMMR定義をアップデートしました。
GNUプロジェクトがいちいちAnalog Devicesのプロセッサの品揃えに対応するはずがないので、gdbが対応するのはプロセッサ・コアの内部レジスタだけです。MMR (Memory Mapped Register) はGNUプロジェクトではない誰かが対応する必要があります。
これまでの対応
Blackfin Koopは、Eclipse用にレジスタ・アクセス用のプラグインを提供しています。これを使えば、Eclipse越しにgdbを使ってBlackfinシリーズのMMRにアクセスできます。この機能を使えばMMRへのアクセスが非常に簡単になります。
ところが、Eclipseを使わない裸のbfin-elf-gdbを使う際には、当然このプラグインは使えません。MMRにアクセスするならばMMRのアドレスとデータサイズを調べて正確な型付けでアクセスしなければなりません。即興で書きますので少々不正確ですが、こんな感じです。
(gdb) print/x *(unsigned short *) 0xFE001104
正直やっていられません。
この問題に対応するために、だいぶ前からTOPPERS/JSP for Blackfin プロジェクトでは少々トリッキーな事をやっています。MMRアクセス用の擬似変数を仕立てて、MMRと同じアドレスにマップしているのです。この仕組みのおかげでgdbからはMMRは変数として扱うことできます。
ところが、話は簡単ではありません。通常の変数であれば、プログラムの開始時に初期値かゼロで埋め立てられます。そんな事をMMRに対して行えば、当然プログラムが異常動作します。そこで色々と策を弄して初期値のロードを阻害していたのですが、結局最近になってそれらの策がLDRファイルの作成に干渉することがわかったため、MMRの定義をTOPPERS/JSP for Blackfin カーネルから削除しました。
新しい方法
現在のTOPPERS/JSP for Blackfinには、MMRファイル用の変数定義もセクション宣言もありません。その代わりに、別のELFファイルを用意しました。
TOPPERS/JSP アプリケーションのELFファイル名は”jsp”です。このファイルをデバッグする場合には、コマンドラインで以下のように操作します。
$ bfin-elf-gdb –q jsp
(gdb) target remote localhost:2000
(gdb) load
通常はここからデバッグが始まりますが、今回用意したMMR定義ファイルを使う場合には、さらに次のようにコマンドを入力します。
(gdb) add-symbols-file mmr_bf592.out 0
mmr_bf592.outが今回使用するELFファイルです。add-symbols-fileはgdbのコマンドで現在ロードされているシンボル情報に対して、新しいファイルからシンボル情報を抽出して追加します。ポイントは新しいファイルをロードしないことで、元からあるjspファイルのシンボルとバイナリを維持したまま、mmr_bf592.outからMMRのアドレスと型情報をロードします。
このファイルを読み込むことで、gdb上ではMMRはアプリケーションのグローバル変数として扱うことができます。gdbは変数名に対してcompletion機能を持っていますので、”mmr”で始まるMMR名を最小のキータイプ数で指定できます。
ファイルの取得方法と対応プロセッサ
ファイルはまだリリースしていません。
CVSのgen_mmr_symbolsモジュールからupdateで取り出してください。makeファイル一発でビルドできます。
対応プロセッサは現在以下の4シリーズです。
- ADSP-BF533
- ADSP-BF537
- ADSP-BF518
- ADSP-BF592
正直このMMR定義は面倒きわまりないため、他のプロセッサに対応するかどうかは未定です。
リリース時期についても未定です。jspカーネル本体と同時期でしょうかね。