OpenOCD小ネタ16 -ついに浮動小数点レジスタ対応す-

かつてRemote'G'パケットうんちゃらかんちゃらのエラーが猛威を振るって
おりましたがたしかあれはダミーのFPUレジスタ分パケットが余分に送り込まれて
いたことが原因だったとおもいます。懐かしいですね…
時は流れ、ついにOpenOCDでもFPUレジスタ(浮動小数点レジスタ)の値を
ちゃんと読めるようになりました
のでご紹介します。

●FPUレジスタを読もう
ねむいさんの開発環境ではデバッガソフトウエアとしてInsightを使用しています。
こいつはクリック一発でレジスタウインドウが開き汎用レジスタとかを参照
できる便利な代物ですがFPUレジスタを見ようとする際はちょっとコツが要ります。
※言うまでもありませんがFPUを使用できるCortex-M4Fコアを持つSTM32F4,LPC4000系の
 マイコンをご用意ください。


先ずはOpenOCD側のcfgファイルの設定ですがかつては頑なにdisableに
していたtdesc(target description)の設定をenableにしてください。
gdb_target_description disable

gdb_target_description enable

現在のおきぱにあるOpenOCDバイナリ及びねむいさん特製cfgは
enableに変更してます。


とりあえずデバッグ手順通りに進め、attachする直前まで。
ここでattachする(runボタン押す)前より先にレジスタウインドウを開いておきます。


そんでattach。そして速攻レジスタウインドウを閉じる


もう一度開くとあら不思議!レジスタウインドウにFPUレジスタが追加されてます♥
注!当たり前ですがFPUを有効にした後に参照してください!
 タイミング的にはmain()の先頭に立った直後が良いでしょう。


FPUが使用された時はレジスタウインドウ内のFPUレジスタの欄もしっかりと更新され、
FPUレジスタの中身がしっかり読み取れていることが分かります。


ちなみにレジスタウインドウを前もって開かずにattach後に開こうとするとInsightが
高い確率でひでぶして落ちてしまいます。tdescの実装直後みたく何やっても落ちる
事は無くなりましたがInsight側の問題とは思いますが上記の確実に参照できる回避
策でお願いします。


FPUを持たないCortex-M3系もちゃんと判別してこんな風に汎用レジスタ
のみ表示となります。


同じくCortex-M4でもFPUが無いKinetis系ではしっかり判別して汎用レジスタ
のみ表示です。


実際のデバッグではRTOSとか使わない限りレジスタの参照する場面は
正直言うとあまりないですが選択肢が増えることは頼もしいことだと思います。
どしどし使っていきましょう。



●あと細かい修正とか注意事項
FPUレジスタの読み取りには関係ありませんがこちらの件もかなり重要なので私に
”エラーが出る!”っていう質問が殺到する前に前もって注意しときます。
こちらのコミットから"make program"でshutdownやexitコマンドを含む
スクリプトを実行するとOpenOCDがエラーを返すようになった為エラー終了
するようになりました。

ねむいさんの公開しているバイナリではフラッシュ書き込みスクリプト付きの
cfgに影響があり、ちゃんと書きこめていてもエラーで終了しているように見えます。

↑こんな感じになります。

これは不具合ではなくこういう動作仕様になっちゃいましたのでご了承ください。
・・・と言いたいと こ ろ  が !!

20150313追:
なんとこの記事書いた直後にご了承できない方がgerritに修正を突っ込まれた
ようです。やっぱし正常に書けてるのにエラーで終わるのは決まり悪いので
ねむいさんも激支援します!
おきぱのopenOCDバイナリも早速反映をしてみましたので
安心してお召し上がりください♥

Go to top of page