Keil环境,在调试STM32中犯过的错

1、貌似的变量冲突
程序中有一个全局变量赋值gUI = 0x0A;可是发现gUI并没有获得这个值,而是另一个位于RAM区首地址0x2000 0000的全局变量获得了这个值,感觉奇怪,堆栈溢出?
后来检查发现,在程序的前一个子函数中有语句:

char ID[8];
sprintf(ID, "%02X%02X%02X%02X", Card_Id[0], Card_Id[1], Card_Id[2], Card_Id[3] ); 
OLED_8x16StrP(0,2,(u8 *)ID);	//液晶显示ID号

上面代码中ID[8]缺少了字符串结束符,而OLED_8x16StrP()函数是以字符串结束符,也就是某个字节为0值判断显示结束的,于是不知道这个函数一直执行到了哪里,最终导致了貌似堆栈溢出的这样的现象,将char ID[8]修改为char ID[9]就ok了。
说白了还是相当于数组溢出了。

2、编译等级修改后容易出错的地方
方便看变量的值,设置编译优化等级为0,后续改为编译优化等级默认/2时,容易出问题的地方(自己遇到过的):
I、子函数中变量没有初始化就直接引用,这本身就是错误。子函数中的这种局部变量,初始化时会随机分配数据,编译优化等级不同时随机分配的数据也会不同,可能在一个编译等级时碰巧没出问题,但换个编译等级就暴露出问题。
II、在中断中引用 的全局的变量没有加修饰符volatile。目前遇到出问题的都是这类语句:…while(gTime < 10);…gTime会在中断中自加,但是最终即便gTime大于10了,程序依然是死在这个地方下不去,这是程序优化的结果,而出问题的原因是全局变量gTime没有加修饰符volatile。
III、编译等级修改后,程序执行的时间会产生很大的变化,程序中非常依赖时间的东东就有可能出现错误,譬如没有优化时,外设初始化等待时间是够的,可是优化之后,等待时间可能就不够导致初始化不成功而出错。
3、SD卡初始化不成功
原子的代码,SPI读卡模式,怎么都不能初始化成功,后来在初始化SD卡之前延时了1秒就OK了,难道是要等SD卡电源稳定?

你可能感兴趣的:(STM32,keil)