下面以我个人环境搭建的过程,简单介绍步骤和对过程的理解。
官网上有具体相关文档介绍:https://esp-idf.readthedocs.io/en/latest/openocd.html
2017.01.17 by chenwu
调试ESP32上的程序,设置断点,查看变量等。
(由于ESP32上程序是在PC上编译,ESP32上运行。交叉编译环境不能用本地的 gdb 进行调试,所以需要JTAG和gdb进行交叉调试)
PC: Ubuntu16.04 + 64位
调试板子:ESP-WROVER-KIT (其中包含ESP32芯片 和 JTAG Adapter)
串口线(用于调试板子和PC通讯)
跳线帽(短路调试板上的电路用)
可以编译 esp-idf 中的 example 中的 01_hello-world 并且 烧入 ESP-WROVER-KIT 运行!!!
(如果不会,请参考:http://espressif.com/en/support/download/documents?keys=&field_type_tid%5B%5D=13 网站中 ESP-IDF Getting Started Guide文档)
在确保理解上面介绍后,正式进入我们的主题 — 环境搭建!
( 详细介绍见:http://espressif.com/en/support/download/documents?keys=&field_type_tid%5B%5D=13 网站中 ESP-WROVER-KIT Getting Started Guide文档)
a) RXD-TXD0 (横向连接)
b) TXD-RXD0 (横向连接)
c) SRST (横向连接)
d) TMS (横向连接)
e) TD0 (横向连接)
f) TDI (横向连接)
g) TCK (横向连接)
h) USB_5V (纵向连接)
$ ll /dev/ttyUSB*
应该有 ttyUSB0 和 ttyUSB1
烧写通过ttyUSB1 , 调试通过 ttyUSB0
// OpenOCD貌似是操作JTAG的东东
$ git clone --recursive https://github.com/espressif/openocd-esp32.git
确保下载完成。文件传输速度慢,如果失败,尝试下面命令:
$ cd openocd-esp32
$ git submodule update --init --recursive
$ cd openocd-esp32
依次执行下面命令:
$ ./bootstrap # 第一条命令
( 如果出现./bootstrap: Error: libtool is required,则需要先安装libtool: sudo apt-get install libtool
)
( 如果出现./bootstrap: 27: ./bootstrap: aclocal: not found,则需要先安装automake: sudo apt-get install automake
)
$ ./configure # 第二条命令
( 如果出现configure: error: ./configure.gnu failed for src/jtag/drivers/libjaylink,则需要先安装libusb-1.0: sudo apt-get install libusb-1.0
)
$ make # 第三条命令
$ sudo make install # 第四条命令
// 貌似是协商一些JTAG相关的参数和调试环境
做法:将 esp-idf/docs/esp32.cfg 文件 拷贝到 openocd-esp32目录下。
$ cp ~/esp/esp-idf/docs/esp32.cfg ./
$ sudo ./src/openocd -s ./tcl -f ./esp32.cfg
// 最好启动另一个shell(如调试esp-idf/examples/01_hello_world)
$ cd ~/esp/esp-idf/examples/01_hello_world/
$ xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' ./build/hello-world.elf
如果成功,调试程序这端会进入类似gdb的shell;OpenOCD这端会收到一个gdb连接。
参考《ESP32编译和调试》
注意:
Error: couldn’t bind tcl to socket: Address already in use
则证明 刚刚启动的 进程未被终止。
解决办法:
a).查看当前活动进程
netstat为显示网络相关信息 a(all:默认显示所有,如果加了其他选项此项不生效) n(number:以数字形式显示) t(仅仅显示tcp连接),p(process:显示该项是由哪个程序建立起来的)
$ sudo netstat -antp
b). 强制杀死它(假设进程号为3560,-9为强制杀死)
$ sudo kill -9 3560
确保串口连接正常, ll /dev/ttyUSB*
应该可以看到两个设备 ttyUSB0 ttyUSB1.如果不是,则 重置ESP-WROVER-KIT开关:从 ON-> OFF -> ON 或者 重新插拔串口线。
ESP-WROVER-KIT上JTAG调试原理猜想:仅仅是猜想!
先熟悉下调试环境:
PC上有两个概念:
gdb调试端: 假设为A // xtensa-esp32-elf-gdb -ex ‘target remote localhost:3333’ ./build/hello-world.elf
OpenOCD端:假设为B // sudo ./src/openocd -s ./tcl -f ./esp32.cfg
ESP-WROVER-KIT上也有两个概念:
JTAG适配器(控制ESP32和OpenOCD通讯)
ESP32(程序执行的指令集所在地方)
step 1. A端 gdb设置调试信息,捕捉hello-world的程序二进制。
step 2. B端与A端连接。gdb信息会传递到 OpenOCD.
step 3. OpenOCD将调试信息传递到JTAG。
step 4. JTAG 会将 调试信息设置好,控制ESP32上程序运行到断点处