工欲善其事,必先利其器。
一. JTAG
二. 日志系统
三. Core Dump
这里先介绍第一种调试方法-JTAG调试,JTAG是从STM32转过来的开发者的第一反应,这里放在最前面介绍。但是对于双核多任务的ESP32应用程序,并非最优的调试方法。
关于调试环境的搭建,参考乐鑫官方文档即可,有中文版详细配置过程:
ESP-WROVER-KIT板载了JTAG功能(FT2232),但是需要连接4个跳线帽接通线路,如下图:
FT2232 是多协议 USB 转串口桥接器。在这里替换了cp2102,并且可以同时提供 USB-to-JTAG ,USB-to-Serial 接口功能,便利开发人员的应用开发与调试。具体配置信息可以查阅 ESP-WROVER-KIT V4.1 入门指南
ESP32 Core Board V2 没有JTAG插口,如果需要硬件调试,需要准备:
按照如下方式连接:
| | ESP32 引脚 | JTAG 信号 |
| 1 | CHIP_PU | TRST_N |
| 2 | MTDO / GPIO15 | TDO |
| 3 | MTDI / GPIO12 | TDI |
| 4 | MTCK / GPIO13 | TCK |
| 5 | MTMS / GPIO14 | TMS |
| 6 | GND | GND |
ESP32 使用标准的 JTAG 接口,支持STM32常用的J-Link,如何使用 J-Link 调试 ESP32,但是不支持ST-Link,也不支持SWD接口:
官方描述: 在软件方面,OpenOCD 支持相当多数量的 JTAG 适配器,可以参阅 OpenOCD 支持的适配器列表 (尽管上面显示的器件不太完整),这个页面还列出了兼容 SWD 接口的适配器,但是请注意,ESP32 目前并不支持 SWD。此外那些被硬编码为只支持特定产品线的 JTAG 适配器也不能在 ESP32 上工作,比如用于 STM32 产品家族的 ST-LINK 适配器。
cd ~/esp/openocd-esp32
bin/openocd -s share/openocd/scripts -f interface/ftdi/esp32_devkitj_v1.cfg -f board/esp-wroom-32.cfg #在openocd安装目录执行,开启openOCD server
cd ~/esp/esp-idf-v3.2.2/examples/get-started/blink
xtensa-esp32-elf-gdb -x gdbinit build/blink.elf #在工程目录执行,连接openOCD
break N:在第N行设置断点
delete N:删除第N行的断点
info break:查看已设置的断点
s(或step):单步调试,可以跳入函数内部
n(或next):单步调试,不跳入函数内部
c:Continue,继续运行,到断点处停止
Ctrl+C:随机停止
q:结束会话
x /1wx 0x3FF44004 #查看0x3FF44004内存位置内容
0x3ff44004: 0x00000000
set {unsigned int}0x3FF44004=0x000010 #设置0x3FF44004内存位置内容
i threads:查看当前所有线程
thread N:查看编号N线程的代码
bt(或backtrace):查看上一层,查看当前函数调用处(仅查看,未跳出)
l:打印停止点处代码
l 30, 40:打印第30-40行代码
help xxx:查看指令xxx的帮助
具体可以查看:使用命令行的调试示例
ESP32 WROVER KIT 自带RGB指示灯,分别接入了IO0、IO2、IO4,注意IO0、IO2的特殊作用。
ESP32管脚 | RGB LED |
---|---|
GPIO0 | 红色 |
GPIO2 | 绿色 |
GPIO4 | 蓝色 |
(gdb) x /1wx 0x3FF44004
0x3ff44004: 0x00000000 #返回0x00000000
设置GPIO2对应的寄存器标志位为1,点亮LED:
(gdb) set {unsigned int}0x3FF44004=0x00000004
遗留问题: 只有写入0x00000004(对应IO2)才能正常点亮,IO0、IO4直接写GPIO_OUT_REG(GPIO 0-31 output register: 0x3FF44004 ),无法实现灯的操作。怀疑受到其他寄存器钳制。
无论先使用命令行还是eclipse调试,都需要先打开openOCD,关系图如下:
cd ~/esp/openocd-esp32
bin/openocd -s share/openocd/scripts -f interface/ftdi/esp32_devkitj_v1.cfg -f board/esp-wroom-32.cfg
- openOCD是硬件层次的调试,gdb是源码层次的调试。
- 在gdb中可以使用monitor发送openOCD的命令,例如monitor reset;halt