一个关于编译器优化选项问题的解决
因为当前项目单片机容量不够使用,打算开启编译器优化,结果在使用KEIL编译器优化后,程序在发送Modbus数据时,程序直接跑飞了
先说结论:
最后发现是局部变量指针作为了DMA的内存地址参数,导致当DMA连续搬运数据时,实际那个局部变量已经被释放,导致DMA搬运数据的过程中出现错误,但是为什么没优化之前没有问题,实在难以理解
确认现象:
当单片机回复上位机的时候就会跑飞,接收不会有问题。
寻找错误:
- 修改单个文件的编译优化等级,发现只有当bsp_modbus.c文件无优化的时候才是正常
- 确定是该文件的程序有问题。
- 通过在线调试发现只有回复异常码时才会卡死:
void MODS_SendAckErr(u8 *pbyBuf,u8 byErrCode) { static u8 byTxbuf[3] = {0}; byTxbuf[0] = pbyBuf[0]; byTxbuf[1] = pbyBuf[1] | 0x80; byTxbuf[2] = byErrCode; MODS_SendWithCRC(byTxbuf, 3); }
就是 byTxbuf出错,把 byTxbuf换成静态的就好了
指针传递不会过程中不会有被释放的风险。