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