[嵌入式学习日志]嵌入式中的栈区变量bug

文章讲述了在帮助师弟调试嵌入式设备代码时遇到的DMA传输问题,发现由于局部变量存储在栈区,函数结束后栈内存被释放,而DMA还在继续使用已销毁的内存,导致数据错误。这个案例揭示了变量管理、内存分配和DMA工作原理的重要性。

debug记录 - 局部变量与栈区

帮师弟改代码bug的时候遇到了一个很经典的运行时内存问题, 而且这种问题可能仅仅会发生在嵌入式设备/并行线程上面

一般的小项目可能也会存在此类隐患, 但也可能不会被表现出来, 从而导致一般程序员忽视这一问题.

出错情况:

在这里插入图片描述
在这个函数里面调用了DMA传输, 传输一组数组内的数据.

但是若没有在函数内等待DMA传输完毕, 便会导致数据出错

正常时序:

在这里插入图片描述

异常时序:
在这里插入图片描述
可以看出, 异常发生时, 前半部分的数据还是正常的, 到了后面就开始出错

很多时候可能会下意识的想到, DMA产生了复写, 即上一次DMA还没有结束, 便开启了第二次的DMA传输, 导致数据冲突

但是经过排查测试, 仅仅调用一次LED_Ribxxxx函数, 也会导致数据出错, 那么问题就不在"重复调用DMA传输"上面

经过师弟自行的排查检查, 发现, 当单独调用HAL_SPI_Transmit_DMA这一函数, 即在LED函数外调用时

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值