ArduinoIDE 上の ESP32 プログラムの JTAG デバッグ †以前,試しに FusionPCB で作った基板を引っ張り出して組み立てました. ESP32 DevkitC に JTAG アダプタを接続するゲタです. 19 ピンの足の長い連結ピンソケットが売られてないので,40 ピンの連結ピンソケットの不要な足を刈り込んで使いました. ESP-IDF 環境での JTAG デバッグは前にネタにしたので,今回は ArduinoIDE 環境でのプログラムのデバッグに挑戦してみます. 環境 †PC †Linux PC 上での開発を前提に書きますが,道具立ては Windows でも一緒なので,Windows 上での手順としても参考になると思います. JTAG アダプタ †Olimex の ARM-USB-TINY-H を使いました. ピンヘッダの配列は ARM JTAG20 というやつです. OpenOCD が対応している ARM JTAG 20 配列のアダプタなら,たぶん他のものでも使えると思います(未確認). ESP-IDF 環境のインストール †ArduinoIDE 環境にも ESP32 のツールチェーンは入ってますが,ESP32 対応の OpenOCD が無いので,ESP-IDF 環境もインストールします. ツールチェーンが2組インストールされることになってしまうけど,気にしないことにします. このページを参考にインストールしましょう. 接続 †ピンソケットに ESP32 基板を刺し,ピンヘッダに JTAG アダプタを接続します. サンプルプログラム †ArduinoIDE 上でプログラムを書きます. void setup() { // put your setup code here, to run once: Serial.begin ( 115200 ); } void loop() { // put your main code here, to run repeatedly: for ( int i = 10; i >= 0; --i ) { Serial.println ( i ); delay ( 1000 ); } } カウントダウンを表示するだけのプログラムです. で,コンパイルする前に
にチェックを入れておきます. ArduinoIDE の下の画面にコンパイル時のコマンドラインが表示されるようになるので,ELF ファイルがどこに生成されるか確認できます. コンパイル・書き込みを実行し,シリアルモニタを開いて,ターゲット上でカウントダウンが動いてることを確認します. OpenOCD の起動 †OpenOCD を起動します. $ cd ~/espressif/tools/openocd-esp32/v0.10.0-esp32-20200420/openocd-esp32 $ bin/openocd -f share/openocd/scripts/interface/ftdi/olimex-arm-usb-tiny-h.cfg \ -f share/openocd/scripts/board/esp-wroom-32.cfg \ -c 'adapter_khz 1000' -c 'gdb_port 3333' Open On-Chip Debugger v0.10.0-esp32-20200420 (2020-04-20-16:15) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html WARNING: boards/esp-wroom-32.cfg is deprecated, and may be removed in a future release. Info : Configured 2 cores adapter speed: 1000 kHz Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections Info : clock speed 1000 kHz Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1) Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1) Info : esp32: Debug controller 0 was reset. Info : esp32: Core 0 was reset. Info : esp32: Debug controller 1 was reset. Info : esp32: Core 1 was reset. Info : cpu0: Detected debug stubs @ 3ffc0c64 Info : Listening on port 3333 for gdb connections GDB の起動 †gdb は,ArduinoIDE のツールチェーンにも ESP-IDF のツールチェーンにも含まれています. ESP-IDF ツールチェーンのほうがパスが通ってるので,こちらを使いました. で,今回は gdb のフロントエンドに gdbgui というものを使いました. web ブラウザ上にに表示してくれます. $ gdbgui -g xtensa-esp32-elf-gdb /tmp/arduino_build_795862/sketch_jun19a.ino.elf もちろん,普通に gdb を起動しても問題ありません. 起動したら以下のコマンドを打ち込みます. (gdb) target remote localhost:3333 (gdb) mon reset halt (gdb) hb loop (gdb) c あとは,変数の内容を確認したり,ステップ実行したりと,セルフ開発時の gdb と同じような感覚で使えます. ただし,ブレークポイントを仕掛けるときは,b ではなく hb コマンドを使います. ターゲット CPU 内部のデバッグ回路を使用したハードウェアブレークポイントコマンドです. ESP32 ではフラッシュ ROM 上のプログラムを RAM 上にロードせずに実行しているので,trap 命令を埋め込めないためです. |