将默认值写入 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 错误

十文件

DataFrame numPartitions 默认值

在 BASH 中,如何使用 plist 上的默认值写入数组中的现有元素?

Python - 读取文本并写入 csv。将空列替换为默认的“N/A”值

将字节数组初始化为某个值,而不是默认的null? [复制]