MSP430,“__no_init” 和"__persistent"介绍
__no_init
是一个C语言中的变量属性修饰符,表示该变量不进行初始化。它通常用于将某个变量存储在特定的内存地址中,如外设寄存器或映射到特定地址的RAM。
与掉电不复位相关的是另一个变量属性修饰符__persistent
,用于将变量存储在非易失性存储器(NVM)中,以便在掉电后保留其值。在MSP430中,可以使用Flash或FRAM作为NVM。需要注意的是,使用__persistent
变量时需要在链接器脚本中指定存储地址和段,并且需要使用专门的读写函数来访问这些变量。
使用 __no_init
在 MSP430 的编程中,__no_init 变量用于声明不需要初始化的变量,它们不会被初始化为默认值。使用 __no_init 变量时,程序员需要自己确保变量被正确地初始化。如果程序员没有对变量进行初始化,则该变量的初始值是未定义的。
__no_init 变量在掉电后不会被自动复位,这意味着在下一次上电之前,变量的值会保持不变。这在某些情况下非常有用,比如保存一些不需要经常更改的配置信息或者状态信息。要使用 __no_init 变量,只需要在变量声明前加上 __no_init 关键字即可。例如:
__no_init unsigned int myVar;
需要注意的是,在使用 __no_init 变量时,需要自己确保变量的内存地址是正确的,并且避免在变量的内存地址范围内进行其他操作,否则会破坏变量的值。
使用 __persistent
__persistent 是 GCC 编译器的扩展,用于定义一个变量将被存储在非易失性存储器中,即使在掉电后也能保持变量的值。
在 MSP430 上,你需要在定义变量时加上 __persistent 关键字来指定它的存储类型。例如:
__persistent int myData @ 0x1880;
上述代码定义了一个 int 类型的变量 myData,它的存储地址为 0x1880,并且它将被存储在非易失性存储器中。
要使用 __persistent,你还需要在链接器脚本中指定相应的存储段和大小。例如,以下代码片段展示了一个链接器脚本的示例,该脚本定义了一个名为 .pinit 的存储段:
MEMORY
{
...
PERSISTENT: (rx) : ORIGIN = 0x1800, LENGTH = 0x800
...
}
SECTIONS
{
...
.pinit : { KEEP(*(.pinit*)) } > PERSISTENT
...
}
在这个链接器脚本中,定义了一个名为 PERSISTENT 的存储段,起始地址为 0x1800,大小为 0x800。.pinit 节点用于将 __persistent 变量放入 PERSISTENT 存储段中。
在程序中,你可以使用 attribute((section(“.pinit”))) 属性来指定变量存储在 .pinit 节点中,例如:
__persistent int myData __attribute__((section(".pinit"))) = 0;
这段代码定义了一个 int 类型的 myData 变量,并将其存储在 .pinit 节点中。由于该变量被标记为 __persistent,因此即使在掉电后,它的值也将保持不变。