将默认值写入 eeprom
Posted
技术标签:
【中文标题】将默认值写入 eeprom【英文标题】:Write default values to eeprom 【发布时间】:2016-02-22 16:18:48 【问题描述】:这是我的设置:
Atmel studio 7.0
avr-gcc
ATmega644PA
我正在尝试。我的意思是:在代码中,eeprom 中特定位置的预定义值。
我可以使用:
__attribute__((section(".eeprom")))
这可以将变量放入 eeprom 中,但这会将变量自动链接到某个位置。 我想手动设置变量的存储位置。我该怎么做?
谢谢!
Ps:这需要为 >300 个变量工作
【问题讨论】:
Initializing a variable and specifying the storage address the same time: is it possible?的可能重复 【参考方案1】:您可以将所有变量放在一个结构中。变量将按指定顺序放入 EEPROM 中。
struct
uint8_t var1;
uint8_t var2;
uint16_t var3;
...
eeprom_data __attribute__ ((section(".eeprom")));
【讨论】:
【参考方案2】:您可以封装您的需求。 例如。你可以使用这个 ASF API:http://asf.atmel.com/docs/3.22.0/xmegae/html/nvm_8h.html
然后将您的默认值写入 EEPROM 以及您的 init 例程是否已设置默认值的标识符。 伪代码:
if defaultWritten == true
myAppDataStruct = readFromEeprom()
else
initEeprom(yourDesiredAddress, myDefaultAppDataStruct)
然后您使用 myAppDataStruct 作为您的 EEPROM 数据的表示。
否则,您可以使用将变量声明到数据部分“.eeprom”的方法,但链接器会为您对齐。
【讨论】:
【参考方案3】:解决方案取决于您是要在编程时间还是在设备每次启动时初始化 EEPROM。我将描述编程时间的解决方案(这是我从问题中理解的)。
__attribute__((section(".eeprom")))
将对链接器说:“将此变量放入 .eep 输出文件中”。 .eep 文件是一种 intel 十六进制文件格式,将被闪存到 EEPROM。
如果你想为你的变量定义特定的位置,你可以手动生成和刷新 .eep 文件,或者做一个完整的 EEPROM 映射,让 0xFF 用于未初始化的值:
__attribute__((section(".eeprom"))) uint8_t eepContent[6] = 0,1,0xFF,3,4,5;
您也可以手动定义部分,但这仅在您想使用不在开头的整个 EEPROM 存储器块时才方便。
【讨论】:
以上是关于将默认值写入 eeprom的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序启用数据保护时,在 ios 中写入 nsuser 默认值时出现 CfPrefrences 错误
在 BASH 中,如何使用 plist 上的默认值写入数组中的现有元素?