Making blackmagic probe espidf board - LEP-KNMS/lep-knms GitHub Wiki

すばらしい先人の偉大な成果物を利用するだけ。 https://github.com/walmis/blackmagic-espidf

背景・目的

遠隔操作したり自律移動するロボット作っていると、書き込みやデバッグのためにPCにケーブルを繋いだまま動かすことが難しい場合がある。

自分の場合、その場で無限に回転し続けるロボットにマイコンがフリーズするバグが発生した。大きさ的にPCも乗らないので、ログも取れず発生タイミングをコントロールできないため原因調査にかなり手間取った。

そもそもフリーズの直接的な原因をログで特定することは困難であり、最も正解に近づける手段はデバッガを使うことである。

しかし、デバッグプローブは普通有線であり、先述の理由でPCに接続することができなかった。 無線書込み装置は結構制作事例があるものの、無線デバッガは聞いたことがなかったため調べたら出てきた、という経緯。

先人に感謝🙏

手段

設計して発注してミスして修正して成功 ef9uel

コケたところ

  • 暗黙の前提として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));