MSP430,“__no_init“ 和“__persistent“介绍

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,因此即使在掉电后,它的值也将保持不变。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值