Making blackmagic probe espidf board - LEP-KNMS/lep-knms GitHub Wiki
すばらしい先人の偉大な成果物を利用するだけ。 https://github.com/walmis/blackmagic-espidf
背景・目的
遠隔操作したり自律移動するロボット作っていると、書き込みやデバッグのためにPCにケーブルを繋いだまま動かすことが難しい場合がある。
自分の場合、その場で無限に回転し続けるロボットにマイコンがフリーズするバグが発生した。大きさ的にPCも乗らないので、ログも取れず発生タイミングをコントロールできないため原因調査にかなり手間取った。
そもそもフリーズの直接的な原因をログで特定することは困難であり、最も正解に近づける手段はデバッガを使うことである。
しかし、デバッグプローブは普通有線であり、先述の理由でPCに接続することができなかった。 無線書込み装置は結構制作事例があるものの、無線デバッガは聞いたことがなかったため調べたら出てきた、という経緯。
先人に感謝🙏
手段
設計して発注してミスして修正して成功
コケたところ
- 暗黙の前提としてESPの開発環境が揃っている前提なのでReadmeのコマンドだけでは不完全。
- Python2.7でビルドしないといけない
- ESPのtoolchainは最新版でよい
- Python pipで必須関連ツールを引っ張ってくる(参考:あとで書く)
- flex bison gperfがmake menuconfigに必要
- ESP8266のIO15をプルダウンし忘れ
参考
STM32CubeIDE LiveExpression対応
- デバッガのコマンドが2つ欠落しているため、そこを実装すれば最近のバージョンのCubeIDEでもLiveExpressionがつかえる。
- 実装するのはReadAPExとReadMemAP、古いCubeIDEは別のコマンドで代用していた。
- ReadMemAPはfirmware_mem_readやadiv5_mem_read_bytesの実装を参考にするとよさそう。まずDP_SELECTに書き込んでゴネゴネする。dp_writeが使えないときはdp_low_accessで代用する(そんなことはないと思うが。)dp_low_writeを使えばエラーを無視する。
ap_mem_access_setup(ap, src, align);
adiv5_dp_low_access(ap->dp, ADIV5_LOW_READ, ADIV5_AP_DRW, 0);
while (--len) {
const uint32_t value = adiv5_dp_low_access(ap->dp, ADIV5_LOW_READ, ADIV5_AP_DRW, 0);
dest = adiv5_unpack_data(dest, src, value, align);
src += (1U << align);
/* Check for 10 bit address overflow */
if ((src ^ osrc) & 0xfffffc00U) {
osrc = src;
adiv5_dp_low_access(ap->dp, ADIV5_LOW_WRITE, ADIV5_AP_TAR, src);
adiv5_dp_low_access(ap->dp, ADIV5_LOW_READ, ADIV5_AP_DRW, 0);
}
}
const uint32_t value = adiv5_dp_low_access(ap->dp, ADIV5_LOW_READ, ADIV5_DP_RDBUFF, 0);
adiv5_unpack_data(dest, src, value, align);
- ReadAPExはDP_SELレジスタにアドレス書き込み(バンクセレクト)、アドレスオフセットが16進で渡されてくる。ほかのコマンドと違ってindexじゃないので翻訳しなくていい分親切なのか?
adiv5_dp_write(dp, ADIV5_DP_SELECT, addr);
result = adiv5_dp_read(dp, ADIV5_DP_REG(offset));