ESP32 调试环境搭建


下面以我个人环境搭建的过程,简单介绍步骤和对过程的理解。
官网上有具体相关文档介绍: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文档)

在确保理解上面介绍后,正式进入我们的主题 — 环境搭建!

三:ESP32调试环境搭建步骤

3.1 ESP-WROVER-KIT 环境搭建

( 详细介绍见:http://espressif.com/en/support/download/documents?keys=&field_type_tid%5B%5D=13 网站中 ESP-WROVER-KIT Getting Started Guide文档)

3.1.1 用跳线帽连接下面插针

    a) RXD-TXD0 (横向连接)
    b) TXD-RXD0 (横向连接)
    c) SRST     (横向连接)
    d) TMS      (横向连接)
    e) TD0      (横向连接)
    f) TDI      (横向连接)
    g) TCK      (横向连接)
    h) USB_5V   (纵向连接)

3.1.2 将 ESP-WROVER-KIT 上的开关调至 ON

3.1.3 用串口线连接 ESP-WROVER-KIT 和 PC的 USB接口

3.1.4 确保PC已经识别ESP-WROVER-KIT设备,PC上查看:

$ ll /dev/ttyUSB*

应该有 ttyUSB0 和 ttyUSB1
烧写通过ttyUSB1 , 调试通过 ttyUSB0

3.2 下载OpenOCD到PC

// OpenOCD貌似是操作JTAG的东东

$ git clone --recursive https://github.com/espressif/openocd-esp32.git

确保下载完成。文件传输速度慢,如果失败,尝试下面命令:

$ cd openocd-esp32
$ git submodule update --init --recursive

3.3 编译并安装OpenOCD

3.3.1 进入openocd目录

$ cd openocd-esp32

依次执行下面命令:

3.3.2 运行引导程序

$ ./bootstrap        # 第一条命令

( 如果出现./bootstrap: Error: libtool is required,则需要先安装libtool: sudo apt-get install libtool)
( 如果出现./bootstrap: 27: ./bootstrap: aclocal: not found,则需要先安装automake: sudo apt-get install automake)

3.3.3 运行配置程序

$ ./configure         # 第二条命令

( 如果出现configure: error: ./configure.gnu failed for src/jtag/drivers/libjaylink,则需要先安装libusb-1.0: sudo apt-get install libusb-1.0)

3.3.4 运行编译程序

$ make            # 第三条命令

3.3.5 运行安装程序

$ sudo make install  # 第四条命令

3.4 配置OpenOCD启动环境并启动 OpenOCD

3.4.1 将esp-idf的配置导入到OpenOCD中

// 貌似是协商一些JTAG相关的参数和调试环境
做法:将 esp-idf/docs/esp32.cfg 文件 拷贝到 openocd-esp32目录下。

$ cp ~/esp/esp-idf/docs/esp32.cfg ./

3.4.2 启动 OpenOCD(启动后不要关闭)

$ sudo ./src/openocd -s ./tcl -f ./esp32.cfg 

3.5 启动调试程序

// 最好启动另一个shell(如调试esp-idf/examples/01_hello_world)

3.5.1 进入 01_hello_world目录

$ cd ~/esp/esp-idf/examples/01_hello_world/

3.5.2 启动调试环境

$ xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' ./build/hello-world.elf

3.5.3 确保成功。

如果成功,调试程序这端会进入类似gdb的shell;OpenOCD这端会收到一个gdb连接。

3.6 调试程序

参考《ESP32编译和调试》


注意:

1. 运行 sudo ./src/openocd -s ./tcl -f ./esp32.cfg 中如果不能启动,出现如下错误

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 

2. make flash失败

确保串口连接正常, 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上程序运行到断点处

你可能感兴趣的:(doc)