Nuvoton Keil技巧篇2 -- Cortex-M 变量初始化

日期2025-08-21

        很多小伙伴使用新唐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、建议所有变量都建议手动进行赋初值。

★方案内容均由个人提供,与平台无关,如有违法或侵权,请联系大大芯方案专属信箱