ESP32S3:开发环境搭建、VSCODE 单步调试、Systemview 分析任务运行情况
目标: 实现点灯工程,并且可以基于 vscode 进行单步调试与 systemview 来分析任务运行情况。
环境搭建
如需在 ESP32-S3 上使用 ESP-IDF,请安装以下软件:
- 设置 工具链,用于编译 ESP32-S3 代码;
- 编译构建工具 —— CMake 和 Ninja 编译构建工具,用于编译 ESP32-S3 应用程序;
- 获取 ESP-IDF 软件开发框架。该框架已经基本包含 ESP32-S3 使用的 API(软件库和源代码)和运行 工具链 的脚本;
主要参考步骤:
https://github.com/espressif/vscode-esp-idf-extension/blob/master/README_CN.md
VScode + ESP-IDF
软件安装步骤简介:
- 安装 vscode,以及一些基础插件。
- 安装 ESP-IDF 插件, 安装完插件记得要重启 VSCODE 。
- 从命令列表中选择 配置 ESP-IDF 扩展。
借助于 ESP-IDF 插件来安装 ESP-IDF 框架:
IDF_TOOLS_PATH
与IDF_PATH
不能相同。- 主要就是 ESP-IDF、ESP-IDF Tools、与 Python virtual enviroment 安装。
demo 编译
windows 使用 ESP 官方的 ESP-IDF 安装包,安装这个框架之后,会生成对应的 CMD 与 PowerShell 。
如果我们 VSCODE 拓展安装好,在 VSCODE 当中也会集成类似的功能,点击这个操作也会配置好对应的开发终端。
我们可以直接打开这个 power shell,在打开这个 Power shell 的时候,他会自动执行一系列脚本,帮我们将这个终端的开发环境配置好,各种环境变量这些。比如说我们在这个终端当中可以直接使用 idf.py build 等等操作。
常规操作:
idf.py set-target esp32s3
idf.py menuconfig
idf.py build
menuconfig 过程当中,配置对应的 Blink Type:GPIO。
配置对应的 GPIO 端口:
最后编译烧录即可。
Openocd + gdb:命令行操作
我们使用的是 ESP32S3 内置的 JTAG 接口,只用一个 USB 线,既能实现串口数据传输,也能实现 JTAG 的烧录与调试。
使用命令行操作 openocd + gdb 来连接ESP32
-
在 IDF-Tools 的目录下,找到 Openocd 的相关配置文件:
xxx\Espressif\tools\openocd-esp32\v0.12.0-esp32-20250422\openocd-esp32\share\openocd\scripts\board
-
builtin 其实就是使用 ESP32S3 内置的 JTAG。
-
使用 openocd 来连接 ESP32,
openocd -f board/esp32s3-builtin.cfg
-
在使用 Openocd 连接的过程中,可能出现 error,这时候需要 zadig安装winusb
-
zadig 安装 USB 驱动,注意安装完驱动将 USB 线重新拔插一下。
也可以尝试下官方推荐的这个操作:
-
安装好之后,必须保证 Openocd 连接无报错。
找到可以连接当前芯片的 GDB 调试工具,ESP32S3 的架构是xtensa,在 ESP-Tools 的目录下可以找到:xxx\Espressif\tools\xtensa-esp-elf-gdb\16.2_20250324\xtensa-esp-elf-gdb\bin
这时候另外启动一个终端,来运行 GDB 工具:xtensa-esp32s3-elf-gdb .\build\blink.elf -x gdbinit
gdbinit 是我们指定,GDB 启动执行的脚本:
set remotetimeout 100
target extended-remote :3333
set remote hardware-watchpoint-limit 2
mon reset halt
flushregs
thb app_main
c
Openocd + gdb:vscode 操作
确认调试方式、调试端口、芯片型号
然后再 settingjson 当中会出现:
{"idf.portWin": "COM4","idf.flashType": "JTAG","idf.openOcdConfigs": ["board/esp32s3-builtin.cfg"],
}
接下来配置 launch 文件,可以直接用插件集成的功能,会自动帮填充 launch 文件
然后就会自动添加好了
Systemview 功能使用
demo 的 CMakeLists.txt 添加 app_trace 组件,注意是需要在 main/ 路径添加,而不是根系统路径下添加。
idf_component_register(SRCS "blink_example_main.c"PRIV_REQUIRES app_trace driverINCLUDE_DIRS ".")
添加之后,就可以直接使用 idf.py menuconfig
来配置对应的功能
在 Openocd 可以成功连接之后,我们可以看到相关的输出,提示我们可以使用 telnet 来连接 openocd:
windows 可能会默认关闭 telnet 功能,需要在windows开启和关闭功能里面开启telnet客户端
这时候我们另外启动一个终端,然后通过 telnet 建立一个连接:telnet localhost 4444
回车,终端会自动连接上目标板。
telnet localhost 4444
代表什么?
- 客户端:就是你的 telnet 程序。
- 服务器:是你刚刚启动的 openocd 进程。
- 接后,你输入的命令(例如 halt、resume、reset run、flash info),都会通过 TCP 4444 端口发送给 OpenOCD。
- OpenOCD 收到命令后,会去操作 USB-JTAG 接口 → 芯片调试寄存器 → 控制 ESP32-S3。
在windows 打开 esp-idf powershell 之后,我们可以查看这个环境使用的 openocd 是哪一个?
- 可以发现这个是 esp32 定制的 openocd ,对应的 github连接:esp32-openocd
- OpenOCD 本体是一个通用调试服务器,支持 ARM、RISC-V、Xtensa 等很多架构。
- Espressif(乐鑫)在官方 OpenOCD 基础上做了扩展(通常叫 esp-openocd),里面增加了不少命令,比如 esp flash、esp sysview 等,专门支持 ESP32/ESP32-S2/S3/C3。
- SystemView 是 Segger 出的一套运行时追踪工具,可以通过 JTAG/SWO 收集 FreeRTOS 任务切换、事件等数据。ESP32 的 OpenOCD 集成了对 SystemView 的支持。
Get-Command openocdCommandType Name Version Source
----------- ---- ------- ------
Application openocd.exe 0.0.0.0 C:\00_SoftWare\07_mcu_dev\esp-idf\Espressif\tools\openocd-esp32\v0.12.0-esp32-20250422\openocd-esp32...
可以从他的开源代码当中看到对应的指令支持:
成功连接会显示:
在终端输入 esp sysview start file://pro-cpu.SVDat file://app-cpu.SVDat
这时候采用 VSCODE 进行调试,这时候他会将调试过程中的信息,写入到 PC 的这两个文件当中。然后终止调试。
最后使用 systemview 来进行离线分析 CPU 的运行情况:
用systemview打开这两个文件,esp32S3是双核的所以会有两个内核的追踪信息文件,一般应用程序追踪信息都在
pro-cpu.SVDat
中
参考文档:
https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32s3/get-started/index.html
https://blog.csdn.net/m0_60134435/article/details/137788122