4

持久变量没有被广泛使用吗?我在网上或我的 C 教科书 - The Art and Science of C 的索引中找不到太多关于它们的信息。

您可以分享的任何关于它们的信息,尤其是它们的范围和示例声明都会有所帮助。我猜要声明他们使用“持久”作为关键字?

static void foo( void ) {
  persistent unsigned int width = 5;
}

这是我能找到的唯一其他有用的参考资料:“当板子关闭和打开时,当 main 运行时,以及发生系统重置时,持久变量保持其状态。当由于加载或卸载文件而下载代码时,持久变量将失去其状态。” http://www.newtonlabs.com/ic/ic_5.html#SEC9

谢谢!

4

4 回答 4

8

Interactive C (您提供的链接)提供了persistent关键字,但这不是标准 C。特别是因为诸如“在板子关闭和打开时、main 运行时以及系统重置发生时保持其状态”之类的保证。

persistent与交互式 C 编译器一起提供,并与专用硬件(在这种情况下为摩托罗拉芯片)一起工作,将变量值存储在非易失性存储器中以实现重启后的持久性。

Interactive C 是许多基于 Motorola 6811 的机器人和嵌入式系统的 C 编译环境。Interactive C 最初是为 MIT LEGO Robot Design Contest (6.270) 开发的,得到了​​广泛的分发和使用。Interactive C 声名鹊起的是它的交互性:用户可以输入表达式并让它们即时编译并立即运行,而不是等待冗长的编译和下载周期。IC 目前支持 6.270、HandyBoard 以及 RugWarrior 和 RugWarrior Pro。 来源

要在本地范围(例如函数)中实现变量持久性,请使用static关键字。

于 2010-12-05T04:01:05.637 回答
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

尽管如此,它们很少被使用,因为它们很少有用,并且在多线程上下文中完全不可接受(它们是等待发生的竞争条件)。

于 2010-12-05T03:57:36.677 回答
1

正如 jkerian 所提到的,持久变量在电路板关闭和打开时保持其状态......但被 C 启动代码(取决于编译器)排除,因为唯一可用于此的内存是 EEPROM。

与其他变量一样,存储在易失性存储器中的持久变量在断电时会丢失内容。但是这种变量在带有 FRAM 的设备上很有用。FRAM 是铁电 RAM 的首字母缩写词,它是一种非易失性存储器,即使在断电后也可以保存数据。注意:在 COFF 模式下的 CCS 上,未初始化的变量未设置为 0(以节省启动时间),因此始终保持不变。

于 2016-04-09T11:36:39.927 回答
1

我经常在我的 PIC MCU 软件中使用持久变量。例如,我会定义一个整数数组来保存错误代码,我希望在重置后保留它(无论是硬件、指令、看门狗等)。此外,我将定义一个整数变量来检查所有持久数据的完整性。当程序启动时,我会将检查变量的内容与特定值进行比较。这可以是任何预定义的值,但我会选择 ram 不太可能启动的值,例如 0xA5F0。如果检查变量包含这个值,那么我可以假设所有其他持久变量都保留了它们的数据,然后继续。但是,如果检查变量不与 0xA5F0 比较,那么我假设所有其他持久变量都包含无效数据,所以我将它们全部初始化,

于 2021-01-16T17:07:59.420 回答