ArduinoIDE 上の ESP32 プログラムの JTAG デバッグ

以前,試しに FusionPCB で作った基板を引っ張り出して組み立てました.

IMG_20200619_083014.jpg

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 アダプタを接続します.

IMG_20200619_083125.jpg

サンプルプログラム

ArduinoIDE 上でプログラムを書きます.

スクリーンショット_2020-06-19_08-26-10.png
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 を起動しても問題ありません.

スクリーンショット_2020-06-19_08-25-40.png

起動したら以下のコマンドを打ち込みます.

(gdb) target remote localhost:3333
(gdb) mon reset halt
(gdb) hb loop
(gdb) c

あとは,変数の内容を確認したり,ステップ実行したりと,セルフ開発時の gdb と同じような感覚で使えます. ただし,ブレークポイントを仕掛けるときは,b ではなく hb コマンドを使います. ターゲット CPU 内部のデバッグ回路を使用したハードウェアブレークポイントコマンドです. ESP32 ではフラッシュ ROM 上のプログラムを RAM 上にロードせずに実行しているので,trap 命令を埋め込めないためです.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-06-19 (金) 10:23:35 (496d)