是否可以指示C不对全局数组进行零初始化?

Mui*_*uis 15 c embedded gcc c99

我正在编写一个嵌入式应用程序,几乎所有的RAM都被全局字节数组使用.当我的固件启动时,它会通过用零覆盖RAM中的整个BSS部分来启动,这在我的情况下是完全没有必要的.

有没有什么方法可以指示编译器不需要对某些数组进行零初始化?我知道这也可以通过将它们声明为指针并使用malloc()来解决,但有几个原因我想避免这种情况.

Lun*_*din 10

问题是标准C 强制执行静态对象的零初始化.如果编译器跳过它,它将不符合C标准.

在嵌入式系统编译器上,通常存在非标准选项"紧凑启动"或类似.启用后,程序中的任何位置都不会发生静态/全局对象的初始化.如何执行此操作取决于您的编译器,或者在这种情况下,取决于您的gcc端口.

如果您提到您正在使用的系统,则有人可能能够为该特定编译器端口提供解决方案.

这意味着您将显式初始化的任何静态/全局(静态存储持续时间)变量将不再被初始化.您必须在运行时初始化它,也就是说,而不是static int x=1;您必须编写static int x; x=1;.以这种方式编写嵌入式C程序是相当常见的,以使它们与禁用静态初始化的编译器兼容.


Mui*_*uis 9

事实证明,我的工具链中包含的链接器脚本有一个特殊的"noinit"部分.

__attribute__ ((section (".noinit")))
Run Code Online (Sandbox Code Playgroud)

/**强制编译器在启动时不自动将给定的全局变量置零,以便保留当前的RAM内容.在大多数情况下,由于移除电源后易失性存储器的行为,该值将是随机的,但可能在某些特定情况下使用,例如在系统看门狗复位后传回值.

因此,标记有该属性的所有全局变量都不会在引导期间进行零初始化.