GDBでCORTEX-M3をきれいにリセットする方法

デバッガが不安定だと何をしているのかわからなくなっていやなものですが、デバッガにはデバッガの事情があっていろいろと難しい面があります。中でも大変なのは「リセット後に停止」することです。
アプリケーションはリセット状態から実行する用にかかれています。しかし、デバッガを使ってデバッグを開始する直前はターゲットは実行状態だったわけで、リセット直後の状態にはなっていません。これを何とかしないと、想定していない状態からの実行となり、いきなりデバッグが破綻します。
OpenOCD / GDBの組み合わせでは、GDBコマンドラインで次のようなことをしろとする例をよくみますし、私もそうしてきました。

(gdb) monitor reset
(gdb) monitor halt

しかしながら、これはうまくいかないことがあります。最初のコマンドでターゲットが実行を開始してしまうため、割り込みにでも入ろうものなら、せっかく停止して新しいプログラムをロードしても、CPUやペリフェラルは割り込みを起こす気満々だったりします。
そうするとSRAMにロードした直後のプログラムは割り込みを受け入れる体制が整っていないため、最初のステップ実行から動作が破綻することもありえます。
そこで、次のようなコマンドを発行すると、この問題を解決できます。

(gdb) monitor soft_reset_halt

停止状態でターゲットをリセットしますので、プログラムをロードしてきれいに実行させることができます。