Lun*_*din 10
问题是标准C 强制执行静态对象的零初始化.如果编译器跳过它,它将不符合C标准.
在嵌入式系统编译器上,通常存在非标准选项"紧凑启动"或类似.启用后,程序中的任何位置都不会发生静态/全局对象的初始化.如何执行此操作取决于您的编译器,或者在这种情况下,取决于您的gcc端口.
如果您提到您正在使用的系统,则有人可能能够为该特定编译器端口提供解决方案.
这意味着您将显式初始化的任何静态/全局(静态存储持续时间)变量将不再被初始化.您必须在运行时初始化它,也就是说,而不是static int x=1;
您必须编写static int x; x=1;
.以这种方式编写嵌入式C程序是相当常见的,以使它们与禁用静态初始化的编译器兼容.
事实证明,我的工具链中包含的链接器脚本有一个特殊的"noinit"部分.
__attribute__ ((section (".noinit")))
Run Code Online (Sandbox Code Playgroud)
/**强制编译器在启动时不自动将给定的全局变量置零,以便保留当前的RAM内容.在大多数情况下,由于移除电源后易失性存储器的行为,该值将是随机的,但可能在某些特定情况下使用,例如在系统看门狗复位后传回值.
因此,标记有该属性的所有全局变量都不会在引导期间进行零初始化.
归档时间: |
|
查看次数: |
9445 次 |
最近记录: |