1

我有一个关于 PIC24F 中数据值的持久性(存储)的问题,即使 PIC 已关闭。

我已通读数据表,但对 EEPROM 和闪存的区别感到困惑。

例如,假设我有一个变量“x”,有没有办法让“x”的值在 PIC 关闭后仍然存在?我知道只要代码是在独立操作 (COE_OFF) 中编译的,程序就可以保留在闪存中。但是,我特别想知道数据值。

如果我将程序存储器和数据值的存储器设置为非易失性,即使断电也会保持不变吗?

我是否需要将值声明为“静态”,例如:static int x; ?

还是我错了,即使关闭电源,数据值也没有办法持续存在?

感谢您的帮助和澄清!

4

3 回答 3

1

您必须使用 TBLWTL 和 TBLWTH 指令在页面中写入闪存,正如您在设备的数据表中阅读的那样。这通常用于通过引导加载程序更新您的软件,听起来这不是您所追求的。

要访问 EEPROM,您可以以较小的单位进行操作,并且有编译器便利宏用于声明变量应位于内存映射中的哪个位置。您可以指定该变量位于 EEPROM 中,编译器将为您生成访问和更新该变量的指令。您还可以使用编译器内在函数或 TBL 指令直接读取它。

声明可能类似于:

unsigned __attribute__((space(eedata), aligned(2)) my_eeprom_variable;

查看生成的汇编程序,了解当您访问变量时编译器做了什么。

声明一个变量static只有传统的 C 语义;它控制变量的范围和初始化规则。

于 2013-02-22T03:48:46.687 回答
0

感谢您的回复!

在提出一些其他建议后,我再次阅读了 MPLAB C30 编译器数据表,发现了“持久”属性。

根据数据表:

“持久属性指定在启动时不应初始化或清除变量。具有持久属性的变量可用于存储状态信息,该状态信息在设备重置后将保持有效。”

我将尝试使用它来看看它是否会起作用。

于 2013-02-22T07:57:37.173 回答
0

断电时寄存器和 RAM 变量的内容会丢失。Flash 和 EEPROM 都是持久的。Flash 只能以大块擦除 - 128K 或更高,具体取决于您拥有的类型。EEPROM 字可以单独读取或写入。如果您有 EEPROM,那是您保存少量数据的最佳选择。通常您必须串行读写 EEPROM。

于 2013-02-22T02:00:38.543 回答