ここのところ時間をかけていたSTM32 HAL用のクラスライブラリですが、一応の完成を見ました。
ちょこちょこと気がついては直し、気がついては直しをしていますが、doxygenのコメントも書き終わっており、基本的には私の中では「つくる」から「つかう」へとシフトしました。まぁ、SPIのタイミング測定なんかは必要ですけどね。
一方で例外処理についてはポスト・モーテムダンプについて再び考え始めています。ライブラリの開発中に時折吹っ飛んでデフォルトハンドラに固着することがあったのですが、こうなるとデバッグ・メッセージさえ出せません。吹っ飛ぶ前にアサートのメッセージを発しているのですが、これはタスクコンテキストで出力するため、例外状態から帰ってこないとなると出力されないのです。
そういうわけで、ポストモーテム・ダンプを考えています。
理想的にはスタックを全解析してコールスタックを例外から遡っていきたいところです。が、これに関してはターゲットだけでは無理だと諦めています。やるとしたら例外の中で全メモリをフラッシュに書き込み、次回動作時にコマンドを受けてシリアルからメモリ・ダンプをすべて出力するなどと言ったことが必要です。
こうして吐き出したメモリ・ダンプとレジスタ・ダンプ、コンパイラのリスト出力があれば原理的にはスタック・フレームを遡っていけるはずです。まぁ、関数のエントリ・コードを解析してFPから古いFPを推測するためのコードを書くのはめんどくさそうではありますが。解析にはFPが必要なため、gccに以下のコンパイル・オプションをつけます。
- -fomit-frame-pointer
- -mtpcs-leaf-frame
加えて、リンカのマップ出力を使えば呼び出し元関数名を知ることもできます。
原理的にはできそうですが、Flashメモリに保存するあたりが面倒ですね。まずはメッセージを全部吐き出すところだけでも検討してみます。