【问题标题】:PIC24F - Possible for data values to persist, even after the PIC is powered off?PIC24F - 即使在 PIC 断电后,数据值也可能保持不变?
【发布时间】:2016-01-14 12:45:59
【问题描述】:

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

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

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

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

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

或者我错了,即使在电源关闭后,数据值也无法保持?

感谢您的帮助和澄清!

【问题讨论】:

    标签: memory-management persistence pic persistent-storage


    【解决方案1】:

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

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

    声明可能类似于:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 一个 PIC24 将在整个设备中拥有高达 128k 的闪存,而不是一个页面。页大小为 1.5kBytes(8 行,每行 64 条指令,每行 3 个字节)。
      【解决方案3】:

      感谢您的回复!

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

      根据数据表:

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

      我将尝试使用它来看看它是否有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多