我的Arduino(例如ATmega328P)中有一个静态全局变量,与任何其他静态非PROGMEM存储一样,它在启动后自动加载到SRAM . 我将其设置为默认值,该值由 setup()
中EEPROM的存储值替换 . 我想提供将变量重置为其原始默认值的功能,而无需在我的代码中再次定义该值 .
是否有可能在Arduino中获取静态全局变量的闪存地址,例如通过 pgm_read_byte()
将其原始数据从闪存加载到SRAM?如果是这样,怎么样?
附:有问题的静态全局变量是一个相当大的结构 . 重新定义它是不可能的 .
1 回答
通过将常量数据声明为
PROGMEM
,可以使常量数据可寻址 . 由于AVR程序存储器在单独的地址空间中被组织为16位字,因此必须使用special functions进行读取 .确认上述示例中的大小与预期一致:默认数据在
Program
中有1000个额外字节,全局变量在Data
中总共1000个字节 .默认数据(以
aaabacadaeaf
开头并继续使用994个零)已经在中断向量之后立即放入程序存储器中 . 它可以在运行时通过pgm_read_
系列函数访问 .