ZHCU876Z July 2001 – October 2023 SM320F28335-EP
默认情况下,全局和静态变量均会初始化为 0。不过,在使用非易失性存储器的应用中,可能最好不要包含已被初始化的变量。Noinit 变量是在启动或复位时不会初始化为 0 的全局或静态变量。
这些 pragma 仅在与 EABI 搭配使用时受支持。它们不支持与 COFF ABI 搭配使用。
可以使用 pragma 或变量属性将变量声明为 noinit 或 persistent。有关在声明中使用变量属性的信息,请参阅节 6.15.4。
除是否在加载时进行初始化之外,Noinit 和 persistent 变量的作用完全相同。
默认情况下,noinit 或 persistent 变量将分别置于名为 .TI.noinit
和 .TI.persistent
的字段中。这些字段的位置由链接器命令文件控制。通常对于支持 FRAM 的器件,.TI.persistent 段置于 FRAM 中,.TI.noinit 段置于 RAM 中。
在非易失性 FRAM 存储器中使用这些 pragma 时,可以通过器件的存储器保护单元来保护存储器区域免受意外写入。有些器件会默认启用存储器保护功能。有关存储器保护的信息,请参阅器件数据表。如果启用了存储器保护单元,那么在修改变量前需要先禁用该功能。
如果您使用的是非易失性 RAM,则可以定义 persistent 变量,将其初始值 0 载入 RAM 中。该程序可以让该变量随时间推移而递增来用作计数器,并且该计数不会因为器件断电和重新启动而消失,因为该存储器为非易失性存储器并且引导例程不会将其初始化为 0。例如:
#pragma PERSISTENT(x)
#pragma location = 0xC200 // memory address in RAM
int x = 0;
void main() {
run_init();
while (1) {
run_actions(x);
__delay_cycles(1000000);
x++;
}
}
这两个 pragma 在 C 语言中的语