当前位置: 首页 > article >正文

【ESP32】ESP-IDF开发 | I2C从机接收i2c_slave_receive函数的BUG导致程序崩溃解决(idf-v5.3.1版本)

1. 问题

        在调试I2C外设的demo时,按照官方文档的描述调用相关API,烧录程序后发现程序会不断崩溃,系统log如下。

        初步分析log,原因是访问到了不存在的地址。一开始我以为是自己的代码问题,反反复复改了几次都会出现同样的问题。

        后面使用backtrace追踪出现问题的代码位置,代码在执行到i2c_slave.c的77行的时候崩溃了。

        这是I2C中断服务函数内调用的,仔细观察发现,这个函数的处理就有问题。i2c_ll_read_rxfifo函数中传入的这个t->rcv_fifo_cnt参数是我们在上层调用i2c_slave_receive函数时传进去的buffer_size,这个参数的官方描述如下。

/**
 * @brief Read bytes from I2C internal buffer. Start a job to receive I2C data.
 *
 * @note This function is non-blocking, it initiates a new receive job and then returns.
 *       User should check the received data from the `on_recv_done` callback that registered by `i2c_slave_register_event_callbacks()`.
 *
 * @param[in] i2c_slave I2C slave device handle that created by `i2c_new_slave_device`.
 * @param[out] data Buffer to store data from I2C fifo. Should be valid until `on_recv_done` is triggered.
 * @param[in] buffer_size Buffer size of data that provided by users.
 * @return
 *      - ESP_OK: I2C slave receive success.
 *      - ESP_ERR_INVALID_ARG: I2C slave receive parameter invalid.
 *      - ESP_ERR_NOT_SUPPORTED: This function should be work in fifo mode, but I2C_SLAVE_NONFIFO mode is configured
 */
esp_err_t i2c_slave_receive(i2c_slave_dev_handle_t i2c_slave, uint8_t *data, size_t buffer_size);

        它指的是用户数据接收buffer的大小,然而在中断处理函数中,程序竟然直接把这个值作为读FIFO寄存器的长度,然而I2C的FIFO只有32字节,77行的memcpy必然会导致数组越界

2. 解决

        具体的修改是上面红框,把所有要传入接收长度的参数改成rx_fifo_cnt,这个值是通过上面i2c_ll_get_rxfifo_cnt函数获取的,它是当前FIFO可读的长度。 

3. 后续

        本来想着到Github上issue一下这个问题,没想到国外有大神已经抢先一步了。这是他的issue链接:https://github.com/espressif/esp-idf/issues/14803


http://www.kler.cn/a/382748.html

相关文章:

  • Spring Boot关闭时,如何确保内存里面的mq消息被消费完?
  • Linux网络编程之UDP编程
  • 老域名seo有什么优势?
  • 【网络】数据链路层
  • vue3 setup写不写到标签上的区别
  • JVM结构图
  • spring-boot(热部署)
  • 《深度学习》bert自然语言处理框架
  • C++:模拟实现STL的vector
  • 零日漏洞被谷歌的 AI 工具发现
  • 华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力6-识别目标形状
  • 【主机游戏】森林之子游戏介绍
  • R语言生物群落(生态)数据统计分析与绘图丨tidyverse数据清洗、多元统计分析、随机森林、回归及混合效应模型、结构方程模型等
  • vue | 自学入门,记录
  • MySQL日期时间函数大全
  • 博客搭建之路:next主题修改侧边栏icon
  • Python画笔案例-096 彩色粒子克隆动画
  • Java多态和继承(上篇)
  • MCU GD32A启动流程及各个段的初始化
  • SDL基本使用
  • 微信支付宝小程序SEO优化的四大策略
  • Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
  • 【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】
  • 【Linux-进程间通信】消息队列
  • 移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (6) - 触屏事件
  • 【极客兔兔-Web框架Gee详解】Day2 上下文Context