0

这是我的设置:

Atmel studio 7.0
avr-gcc
ATmega644PA

我正在尝试将默认值写入 eeprom。我的意思是:在代码中,eeprom 中特定位置的预定义值。

我可以用:

__attribute__((section(".eeprom")))

这可以将变量放在 eeprom 中,但这会将变量自动链接到一个位置。我想手动设置变量存储的位置。我怎样才能做到这一点?

谢谢!

Ps:这需要为> 300个变量工作

4

3 回答 3

2

您可以将所有变量放在一个结构中。变量将按指定顺序放置在 EEPROM 中。

struct {
   uint8_t  var1;
   uint8_t  var2;
   uint16_t var3;
   ...
} eeprom_data  __attribute__ ((section(".eeprom")));
于 2016-08-06T10:49:48.557 回答
0

您可以封装您的需求。例如,您可以使用此 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”中的方法,但链接器会为您对齐。

于 2016-08-15T14:45:20.267 回答
0

解决方案取决于您是要在编程时间还是在设备每次启动时初始化 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 存储器块时才方便。

于 2016-08-23T09:57:13.843 回答