一个关于编译器优化选项问题的解决

因为当前项目单片机容量不够使用,打算开启编译器优化,结果在使用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换成静态的就好了

 

 

 指针传递不会过程中不会有被释放的风险。

 

热门相关:学霸,你女朋友掉了   美食萌后:皇上,喂不饱!   国民女神:重生王牌千金   极品仙医在都市   盖世双谐