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

11 篇文章 0 订阅

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卡电源稳定?
4、一次彩屏白屏问题
复制的代码中有printf()函数,但是这个函数没有重定向,编译也不报错,于是上电就导致彩屏白屏,程序没运行到printf就已经白屏了,上电就白屏,屏蔽掉printf函数就正常了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值