- 追加された行はこの色です。
- 削除された行はこの色です。
* ESP-WROOM-32 を ARM-USB-TINY で GDB デバッグする [#y4c72cd7]
* ESP-WROOM-32をARM-USB-TINYでGDBデバッグする [#y4c72cd7]
ESP-WROOM-32 を ARM-USB-TINY JTAG アダプタで接続して GDB を動かすことができたので,メモ.
ESP-WROOM-32 で hello,world サンプルプログラムが動いたので,「次はデバッガだよね」ということで GDB でデバッグできるようにしてみました.
** 環境 [#o10f0b9c]
#af_amazon(B06XWP81GP,right)
:ターゲットボード|ESP-WROOM-32 ESP32 DevKitC
:JTAGアダプタ|Olimex ARM-USB-TINY
:PC|OS Linux (debian x64; buster(testing))
:開発環境|ESP-IDF
- 素の ESP-WROOM-32 では取扱いが面倒なので,開発ボードを使いました
- JTAG アダプタは手持ちのものを使用.~
名前に ARM と入っているのはコネクタが ARM 標準だというだけで,中の回路はよくある FT2232 を使ったもので,ARM 専用というわけではないです.
- JTAG アダプタは手持ちのものを使用.
-- 名前に ARM と入っているのはコネクタが ARM 標準だというだけで,中の回路は FT2232 を使ったよくあるもので ARM 専用というわけではないです.
-- 今買うなら [[ARM-USB-TINY-H というハイスピード対応のものが同じ値段で売られています>https://strawberry-linux.com/catalog/items?code=15045]].
#clear
** 構成 [#gb75d0cb]
OpenOCD で JTAG プロトコル ←→ GDB プロトコルの変換をさせるという,組み込みではよくある構成です.
図にするとこんな感じかな.
+--------------- Linux PC ------------+
| |
ESP-WROOM-32 <--(JTAG)--> ARM-USB-TINY <--(USB)-|-> OpenOCD <--(TCP loopback)--> GDB |
| |
+-------------------------------------+
** OpenOCD のインストール [#adf51ae8]
[[ここ>https://github.com/espressif/esp-idf/blob/master/docs/api-guides/jtag-debugging/setup-openocd-linux.rst]]の説明に従って,コンパイル済みの tarball をダウンロードし,~/esp で展開します.
** デバッグされるプログラムの用意 [#wc5982b1]
デバッグ対象となるプログラムを用意します.
今回は ESP32 のサンプルプログラムの「[[hello,world>http://esp-idf.readthedocs.io/en/latest/get-started/index.html]] 」を少しいじりました.
main/hello_world_main.c ファイルの app_main() 中で
- app_main() から抜けずにループするようにする
- リブートしないようにする
ようにしました.
デバッガに接続したままリセットがかかると,デバッガとの同期が外れてうまく動きません.
このプログラムをターゲットボードに書き込みます.
** ESP-WROOM-32 と ARM-JTAG-TINY の接続 [#s2242dfe]
ESP-WROOM-32 と ARM-JTAG-TINY を以下の表に従って接続します.
|>|ARM-JTAG-TINY|ESP-WROOM-32|h
|ピン番号|名称|ピン名称|h
|1|VTREF|3.3V|
|4|GND|GND|
|5|TDI|GPIO12|
|7|TMS|GPIO14|
|9|TCK|GPIO13|
|13|TDO|GPIO15|
ARM-USB-TINY のピン番号は[[ここ>http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0499dj/BEHEIHCE.html]]の図を参考にしましょう.
今回はブレッドボードワイヤで接続しました.
一時的なものでなく使いつづけるのならば,きちんとしたものを工作したほうが良いかと思います.
#ref(1509428396842.jpg,center,10%)
** OpenOCD の起動 [#l43f6fd3]
JTAG アダプタを接続し,OpenOCD を起動します.
$ cd ~/esp/openocd-esp32
$ bin/openocd -s share/openocd/scripts -f interface/ftdi/olimex-jtag-tiny.cfg -f \
board/esp-wroom-32.cfg
Open On-Chip Debugger 0.10.0-dev-ga859564 (2017-07-24-16:16)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
adapter speed: 20000 kHz
force hard breakpoints
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 20000 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 was reset (pwrstat=0x5F, after clear 0x0F).
Info : esp32: Core was reset (pwrstat=0x5F, after clear 0x0F).
** GDB の起動 [#c0100953]
OpenOCD を動かしているものとは別にターミナルを開いて GDB を起動します.
$ cd ~/esp/hello_world/
$ xtensa-esp32-elf-gdb build/hello-world.elf
GNU gdb (crosstool-NG crosstool-ng-1.22.0-73-ge28a011) 7.10
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-build_pc-linux-gnu --target=xtensa-esp32-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from build/hello-world.elf...done.
(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x00000001 in ?? ()
(gdb) c
あとは,普通に GDB デバッグするだけです.
注意としては,プログラムのコードは ROM 上にあるので,通常のブレークポイントは使えません.
代わりにハードウェアブレークポイントを使います.
例えば
(gdb) b 37
などでブレークポイントを設定していたところを
(gdb) hb 37
とするだけです.