debug记录 - 局部变量与栈区
帮师弟改代码bug的时候遇到了一个很经典的运行时内存问题, 而且这种问题可能仅仅会发生在嵌入式设备/并行线程上面
一般的小项目可能也会存在此类隐患, 但也可能不会被表现出来, 从而导致一般程序员忽视这一问题.
出错情况:

在这个函数里面调用了DMA传输, 传输一组数组内的数据.
但是若没有在函数内等待DMA传输完毕, 便会导致数据出错
正常时序:

异常时序:

可以看出, 异常发生时, 前半部分的数据还是正常的, 到了后面就开始出错
很多时候可能会下意识的想到, DMA产生了复写, 即上一次DMA还没有结束, 便开启了第二次的DMA传输, 导致数据冲突
但是经过排查测试, 仅仅调用一次LED_Ribxxxx函数, 也会导致数据出错, 那么问题就不在"重复调用DMA传输"上面
经过师弟自行的排查检查, 发现, 当单独调用HAL_SPI_Transmit_DMA这一函数, 即在LED函数外调用时

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





