发现在一个.c文件中有一个初始化为非0的全局变量或静态变量,会使这整个文件中定义的全局变量或静态变量都由.bss段转化为.data段。

.data段的变量会在mcu boot阶段的clib会对这些变量做初始化,.bss段可以透过keilc的config如下图控制是否要跳过clib的初始化为0(目前我们的配置是把IRAM配置为不要初始化) skip bss init 这样的话,我们的芯片在suspend或sleep之后,由于MCU做了power gating,resume起来后MCU重新上电,会重新从MCU boot那边开始跑,.data段的变量就无法保持suspend或sleep之前的值了,又被初始化成定义时候的值了,而.bss段就不会被初始化,可以保持之前的值。

在我们目前usb产品的应用中,一般变量都是要保持suspend/sleep之前的值,所以不能产生有.data段的变量 为了不产生.data段变量,我们要注意:

- 全局变量在定义的时候不能做初始化。 - 不要使用静态的局部变量。

//错误示例:
U8 g_byGlobalVar = 5;
//正确示例:
U8 g_byGlobalVar;
void InitGlobalVars(void)
{
    if(reset_status==RESET_FROM_POWER_ON)
        g_byGlobalVar=5; //InitGlobalVars()函数中做初始化
}