关注+星标公众号,不错过精彩内容
作者 | 量子君
微信公众号 | 极客工作室
【ESP32填坑日记】专栏介绍: 本专栏包含大量的ESP32开发教程、实例以及经验分享,详细的讲述了怎样配置ESP32,怎样使用ESP32,以及在实际开发过程中遇到的问题及解决方案等。每一篇“填坑”文章都会具体到某一问题,例如电源问题、焊接问题、编程问题等,这样设计的目的就是为了让每一位读者都能找到自己需要的解答。
本章目录
前言 一、JTAG仿真
1.1 准备工作:
1.2 使用教程
二、日志调试法
三、Core Dump
3.1 coredump配置
3.2 基于flash coredump获取方式
3.2.1 读取coredump
3.2.2 解析coredump
3.2.3 coredump文件分析
四、内存调试手段
4.1 断言
4.2 钩子函数
4.3 定位内存踩踏
4.4 定位内存泄露
五、其它
5.1 系统各任务运行百分比获取
5.2 任务堆申请情况
5.3 任务运行详细情况
5.4 systemview
5.5 使用PSRAM
总结
前言
一、JTAG仿真
ESP32内置JTAG,可以直接使用USB接口进行仿真调试。
仿真调试方法如下:
1.1 准备工作
先进行安装OpenOcd配置(一般在VScode环境中进行安装ESP的组件后会自动安装)
更改OpenOcd配置:
更改截图中选中部分的配置更改为如下配置:“board/esp32s3-builtin.cfg”
更改仿真文件:
①将上图选中的文件使用如下文件进行替换
②将替换后的文件中的工具路径更改为本电脑中安装的位置
1.2 使用教程
点击界面底部OpenOCD Server
点击start OpenOCD Server ,底部变绿为正常打开
点击左侧仿真按钮,点击运行GDB仿真,如下图为正常程序仿真,下列可进行查看堆栈和进行监视
添加监视点,选中变量点击右键
二、日志调试法
ESP_LOGE - 错误(最低)
ESP_LOGW - 警告
ESP_LOGI - 信息
ESP_LOGD - 调试
ESP_LOGV - 详细(最高)
三、Core Dump
info_corefile - 打印崩溃任务的寄存器、调用栈、系统有效任务列、内存区域以及存储在 core dump 中的内存中的内容(任务控制块 TCB 和栈)。
dbg_corefile - 创建 core dump ELF 文件,并使用这个文件运行 GDB 调试会话。用户可以人工检查内存、变量和任务状态。需要注意的是,由于不是所有的内容都存放在 cour dump 中,只有分配到栈上的变量值才有意义。
3.1 coredump配置
可以设置coredump输出方式 支持的任务数 coredump栈大小等信息。
3.2 基于flash coredump获取方式
3.2.1 读取coredump
python -c "import esptool; esptool.main(['--port', 'COM110', 'read_flash', '0x20000', '0x1000', 'appback.bin'])"
0x20000和0x1000是coredump存放的地址和大小,根据项目的分区表确定。
3.2.2 解析coredump
读取完成后,电脑工程目录存在appback.bin文件,就是coredump的文件,使用如下命令进行文件解析。
例:
D:/esp-idf-v5.0.5/components/espcoredump/espcoredump.py info_corefile --core appback.bin --core-format raw
D:/ESP325/0809/f-c-c606tmp/Project_C606/build/Project_C606.elf
其中appback.bin是上一步读取到的coredump原始文件;
Project_C606.elf是编译时对应的elf文件。
3.2.3 coredump文件分析
主要包含以下信息:
崩溃的任务
死机原因
寄存器快照
当前任务栈调用信息
任务调用关系
各任务死机时刻的快照
四、内存调试手段
4.1 断言
4.2 钩子函数
4.3 定位内存踩踏
4.4 定位内存泄露
可以使用esp_get_free_heap_size函数获取系统剩余的堆内存大小,通过不同时间段对比可以了解内存消耗情况,监测是否存在内存泄露。建议该项检测作为我们产品开发的常规检测项。 可以选择运行区间的所有内存申请释放情况,也可以只打印没释放的内存。
以下是选择HEAP_TRACE_ALL的打印情况:
五、其它
5.1 系统各任务运行百分比获取
用于系统负载情况,平衡算力。
5.2 任务堆申请情况
打印各任务堆申请情况
5.3 任务运行详细情况
/*********************************************************************************
函数名:vTaskList
功能:查看任务信息
输入:pcWriteBuffer[任务信息存放的地址]
输出:无
*********************************************************************************/
void vTaskList( char * pcWriteBuffer )
5.4 systemview
可以更详细打印任务、中断之间的切换关系,时序关系。
5.5 使用PSRAM
一些场景下,内部RAM资源非常有限,需要尽可能多的使用外部PSRAM,以下是使用PSRAM的几种方法:
开启后有EXT_RAM_BSS_ATTR 关键字的初始化为0的变量将被分配到PSRAM中。
static EXT_RAM_BSS_ATTR UserOption g_userOption = {0};
malloc分配:
malloc申请时指定关键字MALLOC_CAP_SPIRAM,这样申请的内存就会使用PSRAM。
开启相关模块的PSRAM使能功能: