很多小伙伴使用新唐Cortex-M系列产品时,老是会忘记对变量进行初始化,比如指针、数组等,并认为系统默认就会给定义的变量初始化的。
我们来验证看看,我们定义两个变量,一个全局变量u16ADCData0和一个局部变量u16ADCData1。
如下工程所示,在debug模式下,地址分配情况:u16ADCData0指向地址0x20000068, u16ADCData1没有指向地址。
通过打印的log信息来看,u16ADCData0 = 0x0000 ,u16ADCData1 = 0x40070000。很明显,局部变量u16ADCData1默认没有清零。


打开keil 配置发现优化等级选的是O3。

我们来了解下优化等级的差异:
O0:几乎不优化,断点可以任意打,任何变量都可以监测,调试阶段建议用这个等级。
O1:轻度优化,有些代码打不了断点。
O2:中度优化,Debug时代码有时会乱跳。
O3:重度优化,代码编译后最省空间。
我们把优化等级改成O0再测验证看看情况。
在debug模式下,地址分配情况:u16ADCData0指向地址0x20000068, u16ADCData1指向地址0x20000240。
通过打印的log信息来看,u16ADCData0 = 0x0000 ,u16ADCData1 = 0x0000 。


综上验证结论:
1、优化等级0时,为所有变量分配内存地址,全局变量和局部变量会进行自动清零。缺点是占用较大程序空间。
2、优化等级3时,优化掉局部变量,不会为其分配内存地址,所以查不到内存地址。全局变量会自动清零,局部变量不会自动清零。这样不便于程序开发调试。好处是占用较小程序空间。
3、建议所有变量都建议手动进行赋初值。
159

被折叠的 条评论
为什么被折叠?



