这是我的设置:
Atmel studio 7.0
avr-gcc
ATmega644PA
我正在尝试将默认值写入 eeprom。我的意思是:在代码中,eeprom 中特定位置的预定义值。
我可以用:
__attribute__((section(".eeprom")))
这可以将变量放在 eeprom 中,但这会将变量自动链接到一个位置。我想手动设置变量存储的位置。我怎样才能做到这一点?
谢谢!
Ps:这需要为> 300个变量工作
这是我的设置:
Atmel studio 7.0
avr-gcc
ATmega644PA
我正在尝试将默认值写入 eeprom。我的意思是:在代码中,eeprom 中特定位置的预定义值。
我可以用:
__attribute__((section(".eeprom")))
这可以将变量放在 eeprom 中,但这会将变量自动链接到一个位置。我想手动设置变量存储的位置。我怎样才能做到这一点?
谢谢!
Ps:这需要为> 300个变量工作
您可以将所有变量放在一个结构中。变量将按指定顺序放置在 EEPROM 中。
struct {
uint8_t var1;
uint8_t var2;
uint16_t var3;
...
} eeprom_data __attribute__ ((section(".eeprom")));
您可以封装您的需求。例如,您可以使用此 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”中的方法,但链接器会为您对齐。
解决方案取决于您是要在编程时间还是在设备每次启动时初始化 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 存储器块时才方便。