Debug正常Release出错
最近的Project添加了运动控制代码,没加之前的Release是正常的。添加后的Debug正常,能控制电机转,但Release却不行,能与电机通讯却不能控制电机转。
于是,变量初始化、内存分配、甚至在release中打印执行到的行数等等,想破头都没解决。还好在一位博士指导下得以解决。
原因是宏定义,代码中有四个读写内存的宏定义要经常用到,而且有时要连续使用,可是操作的却是一个地址,如:
MEM_WRITE_WORD(g9001_cmd,0x200);
MEM_WRITE_WORD(g9001_cmd,0x300);
这两句本意是初始化通讯板,使之做好通讯准备,由于操作的是同一个变量,所以在Release中就将之优化掉,结果只执行了第二句
MEM_WRITE_WORD(g9001_cmd,0x300),于是就出现了通讯可以但无法控制电机转。
知道问题就好,于是简单的将这四个宏转成函数,解决!
原宏定义如下:#define MEM_WRITE_WORD(adr,data) (*(unsigned short *)adr = data)
现改为函数:
void MEM_WRITE_WORD(volatile unsigned long adr,unsigned short data) { *(unsigned short *)adr = data; Sleep(1); }
改为函数后之所以能解决问题是因为函数在被调用时生成了自己的堆栈;而宏在编译后直接替换为其实际代码,在Release编译时发现出现了两条对同一个地址写数据段语句,就会将其优化掉,只执行最后一条。而改为函数后,在调用时会进入函数堆栈,所以不会被优化掉第一条。
只是这样函数执行效率会降低,不管怎样生成的Release总比Debug的运行效率高!