c中的持久局部变量

Posted

技术标签:

【中文标题】c中的持久局部变量【英文标题】:persistent local variable in c 【发布时间】:2010-12-05 03:54:12 【问题描述】:

持久性变量没有被广泛使用吗?我在网上或我的 C 教科书——C 的艺术与科学的索引中找不到太多关于它们的信息。

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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。 source.

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

【讨论】:

persistent 也是 Microchip 8 位编译器中的关键字。它同样表示指定的变量不应该被运行时启动代码清除。【参考方案2】:

在本地(非全局)上下文中,您想要的关键字是 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 的调用之间保持不变。

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

【讨论】:

哇,当我上第一堂课时回到这个话题。我不知道“持久”是什么意思。再次感谢大家 这个答案有点落伍。 static 关键字与变量范围有关,是 C 标准的一部分。 persistent 关键字控制变量内存在启动时如何初始化,并且不是标准 C。请参阅 ***.com/a/4357304/973624 以获得更完整的答案。 @mrtumnus 呃……是的。我应该删除它,但是当它被接受时,我不能这样做。我不得不想知道为什么 tarabyte 接受它。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于c中的持久局部变量的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的 局部变量,存储在啥地方?

C语言中的全局变量和局部变量

C语言中的局部变量和全局变量

C语言中的局部变量和全局变量

C语言基础:作用域规则(局部变量,全局变量,形式参数)全局变量与局部变量在内存中的区别初始化局部变量和全局变量

全局变量比C中的局部变量快吗? [关闭]