【问题标题】:Can data types saved in PROGMEM be changed later on in the program?保存在 PROGMEM 中的数据类型可以稍后在程序中更改吗?
【发布时间】:2015-09-03 16:35:51
【问题描述】:

您好,我正在 Arduino 上制作游戏,但我需要存储 2 个全局变量来跟踪 uint32_t 类型的分数 currScor 和 hiScor 并节省内存空间,我将它们标记为 uint32_t currScor @987654323 @一旦游戏开始,分数就会开始增加,但编译器说我不能分配给一个常量变量。有没有办法可以添加到存储在闪存中的这个变量?我是否应该考虑使用 EEPROM,尽管我担心写入过多会烧毁该内存类型。

【问题讨论】:

  • 程序闪存会在 EEPROM 之前烧毁。

标签: c flash arduino eeprom uint32-t


【解决方案1】:

Arduino 有 4 种内存:

  1. 闪光
  2. EEPROM
  3. SRAM
  4. CPU 寄存器

通过简单的分配操作闪存和 EEPROM 是不可能的。对于 EEPORM 的操作,存在众所周知的库。也可以在程序中操作 Flash/Progmem。该技术在 ATMEL 数据表AVR105: Power Efficient High Endurance Parameter Storage in Flash Memory 中进行了描述。但是我不知道有任何支持这个的开源库。

如果您想保留 RAM,这很可能不是可行的方法。相反,您应该将字符串和其他大而固定的东西放入程序中。

【讨论】:

    【解决方案2】:

    对于分数,您应该改用 RAM,因为它会不断更新,并且无需在单个游戏周期之后保留它的价值。

    对于 hiscore,您可以在游戏结束后将其写入 EEPROM。根据数据表,它至少可以写10万次,所以如果你一年365天每天玩100次,它几乎不会磨损3年。之后,只需将 EEPROM 位置更改为另一个地址。如果您使用 Arduino Uno(带有 1 Kb EEPROM),您有 32 个不同的位置来存储 uint32_t 数据。 32 x 3 年 = 96 年 ;)

    【讨论】:

      【解决方案3】:

      您的直觉是正确的,因为您将无法更改存储在程序存储器空间(又名闪存/ROM)中的值。如果您担心烧毁 EEPROM。让它只定期更新。但是,您仍然需要有 RAM 来缓冲它。

      我强烈建议在其他地方保留 RAM。 见下文examples library to measure and conserve RAM

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多