【ESP32填坑日记】技巧篇① 常用调试方法

文摘   科技   2024-11-20 07:04   山东  

关注+星标公众,不错过精彩内容

作者 | 量子君

微信公众号 | 极客工作室

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

  • 总结

前言

本章介绍了ESP32平台常用的调试方法及调试样例。

一、JTAG仿真

ESP32内置JTAG,可以直接使用USB接口进行仿真调试。

仿真调试方法如下:

1.1 准备工作

  1. 先进行安装OpenOcd配置(一般在VScode环境中进行安装ESP的组件后会自动安装)

  2. 更改OpenOcd配置:


    更改截图中选中部分的配置更改为如下配置:“board/esp32s3-builtin.cfg”

  3. 更改仿真文件:


    ①将上图选中的文件使用如下文件进行替换

    ②将替换后的文件中的工具路径更改为本电脑中安装的位置

1.2 使用教程

  1. 点击界面底部OpenOCD Server

  2. 点击start OpenOCD Server ,底部变绿为正常打开

  3. 点击左侧仿真按钮,点击运行GDB仿真,如下图为正常程序仿真,下列可进行查看堆栈和进行监视


  4. 添加监视点,选中变量点击右键

二、日志调试法

  • ESP_LOGE - 错误(最低)

  • ESP_LOGW - 警告

  • ESP_LOGI - 信息

  • ESP_LOGD - 调试

  • ESP_LOGV - 详细(最高)

三、Core Dump

ESP-IDF 支持在遇到不可恢复的软件错误时产生 core dump。这项有用的技术允许发生错误后再分析软件的状态。程序一旦崩溃,系统将进入 panic 状态,打印一些信息并挂起或者重启系统(依赖于配置)。用户可以选择产生 core dump 文件,从而可以在随后在 PC 上分析失败的原因。Core dump 中包含失败的那一刻系统中所有任务的快照。快照包括导致系统崩溃的线程的调用栈(callstack)。 ESP-IDF 提供了一个特殊的脚本 espcoredump.py 用于帮助用户恢复和分析 core dump。该工具提供了两个用于分析 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文件分析

主要包含以下信息:

  1. 崩溃的任务

  2. 死机原因

  3. 寄存器快照

  4. 当前任务栈调用信息

  5. 任务调用关系

  6. 各任务死机时刻的快照

四、内存调试手段

内存调试主要用于定位开发中常见的内存使用错误,例如,内存不足、内存泄露、内存越界等问题。

4.1 断言

开启断言后如果出现内存踩踏,会有报错。或者主动通过API函数进行检测,逐步定位问题。

4.2 钩子函数

4.3 定位内存踩踏

4.4 定位内存泄露

  1. 可以使用esp_get_free_heap_size函数获取系统剩余的堆内存大小,通过不同时间段对比可以了解内存消耗情况,监测是否存在内存泄露。建议该项检测作为我们产品开发的常规检测项。


  2. 可以选择运行区间的所有内存申请释放情况,也可以只打印没释放的内存。 

    以下是选择HEAP_TRACE_ALL的打印情况:

五、其它

5.1 系统各任务运行百分比获取

用于系统负载情况,平衡算力。

5.2 任务堆申请情况

打印各任务堆申请情况

5.3 任务运行详细情况

/*********************************************************************************函数名:vTaskList功能:查看任务信息输入:pcWriteBuffer[任务信息存放的地址]输出:无*********************************************************************************/void vTaskList( char * pcWriteBuffer )

5.4 systemview

可以更详细打印任务、中断之间的切换关系,时序关系。

5.5 使用PSRAM

一些场景下,内部RAM资源非常有限,需要尽可能多的使用外部PSRAM,以下是使用PSRAM的几种方法:

  1. 开启后有EXT_RAM_BSS_ATTR 关键字的初始化为0的变量将被分配到PSRAM中。

    static EXT_RAM_BSS_ATTR UserOption g_userOption = {0};
  2. malloc分配:

    #define MID_MALLOC(size) heap_caps_malloc(size,  MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)

    malloc申请时指定关键字MALLOC_CAP_SPIRAM,这样申请的内存就会使用PSRAM。

  3. 开启相关模块的PSRAM使能功能:


总结

本章介绍了ESP32平台常用的调试方法及调试样例。








若觉得文章对你有帮助,随手点『好看』、转发分享,也是对我的支持
关注我的微信公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
点击“阅读原文”查看更多分享

极客工作室
一个专注于嵌入式系统、智能硬件、AIoT的极客自媒体
 最新文章