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中的持久局部变量的主要内容,如果未能解决你的问题,请参考以下文章