我有一个用C编写的ATmega代码,用GCC编译器编译。
有些数据需要存储在EEPROM中,所以我添加了这些声明:
在读取EEPROM之后,我发现数据以某种奇怪的方式放置。经过一些调查后,我在.map文件中找到了这个文本(由工具链生成的许多文件之一):
正如您所见,编译器以相反的顺序放置数据。
当然我可以撤销声明并享受进一步的编码,但这是意想不到的事情所以我不敢面对任何其他意外的行为,直到我不明白为什么编译器这样做。
有什么想法吗?
答案 0 :(得分:2)
正如@Lundin所说,全局变量不需要连续分配。
您可以使用struct
的功能,其成员始终被分配in the same order。
根据C11标准,§6.7.2.1.15:
在结构对象中,非位字段成员和位字段所在的单位的地址会按声明的顺序增加。
请注意padding!