持久性变量是否未被广泛使用?我无法在网上或在我的C教科书索引中找到关于它们的更多信息 - C的艺术和科学。
您可以分享关于他们的任何内容,尤其是他们的范围和示例声明会有所帮助。我猜是要声明他们使用'persistent'作为关键字?
static void foo( void ) {
persistent unsigned int width = 5;
}
这是我能找到的唯一其他有用的参考: “持续变量在电路板关闭和打开时,主电源运行时以及系统复位发生时保持其状态。由于加载或卸载文件而下载代码时,持久变量将失去其状态。“ http://www.newtonlabs.com/ic/ic_5.html#SEC9
谢谢!
答案 0 :(得分:8)
Interactive C(您提供的链接)提供persistent
关键字,但不是标准C 。特别是因为" 等保证在电路板关闭和打开时,主电源运行时以及系统复位时保持状态"
persistent
随Interactive C编译器一起提供,并与专用硬件配合使用,在这种情况下为Motorola芯片,将变量值存储在非易失性存储器中,以实现重启的持久性。
Interactive C是许多基于Motorola 6811的机器人和嵌入式系统的C编译环境。 Interactive C最初是为麻省理工学院乐高机器人设计大赛(6.270)开发的,因此得到了广泛的分销和使用。 Interactive C声称其声誉是它的互动性:用户可以输入表达式并让它们即时编译并立即运行,而不是等待冗长的编译和下载周期。 IC目前支持6.270,HandyBoard和RugWarrior以及RugWarrior Pro。 source
要在本地范围内实现变量持久性(例如函数),请使用static
关键字。
答案 1 :(得分:3)
您想要的关键字是本地(非全局)上下文中的static
。
上下文很重要:
#include <stdio.h>
static int foo;
int main(int argc, char **argv){
//...
}
此处static
表示foo
具有文件范围(即不是extern
)。
而在
char *strtok(char *str, char *sep){
static char *last;
//...
}
last
在对strtok
的调用之间保持不变。
所有这一切,它们很少被使用,因为它们很少有用,并且在多线程环境中(在等待发生的竞争条件下)完全不可接受。
答案 2 :(得分:1)
我经常在我的 PIC MCU 软件中使用持久变量。例如,我会定义一个整数数组来保存错误代码,我希望在重置后保留(无论是硬件、指令、看门狗等)。此外,我将定义一个整数变量来检查所有持久数据的完整性。当程序启动时,我会将检查变量的内容与特定值进行比较。这可以是任何预定义的值,但我会选择内存不太可能启动的值,例如 0xA5F0。如果检查变量包含这个值,那么我可以假设所有其他持久变量都保留了它们的数据,然后继续。但是,如果检查变量没有与 0xA5F0 进行比较,那么我假设所有其他持久变量都包含无效数据,因此我会将它们全部初始化,并将检查变量设置为 0xA5F0。
答案 3 :(得分:0)
正如jkerian所提到的,持久变量在电路板关闭和开启时保持其状态......但被C启动代码(依赖于编译器)排除,因为可用于此的唯一内存是EEPROM。
与其他变量一样,存储在易失性存储器中的持久变量会在断电时丢失内容。但是这种变量在FRAM设备上很有用。 FRAM是铁电RAM的首字母缩写,whitch是一种非易失性存储器,即使在断电后也能保存数据。 注意:在COFF模式下的CCS上,未初始化的变量未设置为0(以节省启动时间),因此始终是持久的。