【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/908696.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)

AB链表公共元素生成链表C 设A和B是两个单链表(带头节点),其中元素递增有序。设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A、B的节点 算法思想 表A,B都有序,可从第一个元素起依次比较A、B两表的元素,若元…

蓝牙BLE开发——红米手机无法搜索蓝牙设备?

解决 红米手机,无法搜索附近蓝牙设备 具体型号当时忘记查看了,如果你遇到有以下选项,记得打开~ 设置权限

2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能

基于matlab-GUI的脉冲响应不变法实现音频滤波功能,输入加噪信号,通过巴特沃斯模拟滤波器脉冲响应不变法进行降噪。效果较好。程序已调通,可直接运行。 下载源程序请点链接:2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能…

智慧生活新标准:解锁耐能科技的潜能

『从马路上,看到旁边摄影机下方的牌子写着科技执法』 『开车进入停车场时,车牌辨识成功开启闸门』 『回到家门口前,进行脸部辨识解锁开门』 『手机APP弹起提醒,出现宝宝的画面表示正在哭泣』 上述的情景,你我是否很熟悉…

[VUE]框架网页开发1 本地开发环境安装

前言 其实你不要看我的文章比较长,但是他就是很长!步骤其实很简单,主要是为新手加了很多解释! 步骤一:下载并安装 Node.js 访问 Node.js 官网: Node.js — Download Node.js 下载 Windows 64 位版本&…

C++线程异步

本文内容来自: 智谱清言 《深入应用C11 代码优化与工程级应用》 std::future std::future作为异步结果的传输通道,可以很方便地获取线程函数的返回值。 std::future_status Ready (std::future_status::ready): 当与 std::future 对象关联的异步操作…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分,图形显示有所变化,美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

后端eclipse——文字样式:UEditor富文本编辑器引入

目录 1.富文本编辑器的优点 2.文件的准备 3.文件的导入 导入到项目: 导入到html文件: ​编辑 4.富文本编辑器的使用 1.富文本编辑器的优点 我们从前端写入数据库时,文字的样式具有局限性,不能存在换行,更改字体…

基于springboot+小程序的汽车销售管理系统(汽车4)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 1、管理员实现了首页、个人中心、管理员管理、基础数据管理、论坛管理、公告信息管理、汽车管理、用户管理、轮播图信息等。 ​ 2、用户实现了注册、登录、首页、汽车类型、论坛、购物…

江协科技STM32学习- P29 实验- 串口收发HEX数据包/文本数据包

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

Quartz的使用

1.准备工作 建立Maven工程 2.引入Quartz的jar包 <dependencies><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version></dependency></dependencies>3…

黑马官网最新2024前端就业课V8.5笔记---CSS篇(2)

盒子模型 画盒子 目标:使用合适的选择器画盒子 新属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vi…

单片机串口接收状态机STM32

单片机串口接收状态机stm32 前言 项目的芯片stm32转国产&#xff0c;国产芯片的串口DMA接收功能测试不通过&#xff0c;所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣&#xff0c;不过我的芯片已经主频跑…

Android Studio 安装过程

以前用 Eclipse 开发&#xff0c;最近尝试 Android Studio 开发&#xff0c;发现 Android Studio 比 Eclipse 速度快多了&#xff0c;下面是安装 Android Studio 过程日志。 Gradle 下载地址&#xff1a;https://services.gradle.org/distributions/ https://developer.andro…

github.io出现的问题及解决方案

1. 你的连接不是专用连接 放假回家后打开自己的博客&#xff0c;发现无法打开博客&#xff0c;一开始以为是调样式时不小心搞坏了&#xff0c;打开别人的githunb.io博客发现都会出问题&#xff0c;并且用手机不连接wifi可以正常打开 解决办法&#xff1a; 方法一&#xff1a; …

商场应急管理措施和预案|基于springboot+vue的大型商场应急预案管理系统(源码+数据库+文档)

商场应急管理系统 目录 基于springbootvue的大型商场应急预案管理系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

【ACM出版,EI稳定检索】2024年人工智能、数字媒体技术与交互设计国际学术会议(ICADI 2024,11月29-12月1日)

2024年人工智能、数字媒体技术与交互设计国际学术会议&#xff08;ICADI 2024) 2024 International Conference on Artificial Intelligence, Digital Media Technology and Interaction Design 官方信息 会议官网&#xff1a;www.icadi.net 2024 International Conference o…

【Linux】命令行参数 | 环境变量

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 前几天在搞硬件&…

Stable diffusion 3.5本地运行环境配置记录

1.环境配置 创建虚环境 conda create -n sd3.5 python3.10Pytorch(>2.0) conda install pytorch2.2.2 torchvision0.17.2 torchaudio2.2.2 pytorch-cuda12.1 -c pytorch -c nvidiaJupyter能使用Anaconda虚环境 conda install ipykernel python -m ipykernel install --user …

CODESYS可视化星三角降压启动程序控制电气动画图

#一个用CODESYS可视化做的星三角降压启动程序控制电气动画图# 前言: 关于星三角降压启动控制,作为电气行业入门的必备知识点,涉及到电机本身特性导致的电压,电流(转矩),功率和转速等一系列的关系和变化,以及星型和三角形的绕组方式。本篇我们使用CODESYS结合程序和可视…