AVR 上不同内存部分的结构包装

Struct packing in different memory sections on AVR

有如下结构:

typedef struct {
    uint8_t val1;
    uint16_t val2;
}some_config_type;

some_config_type EEMEM config = {
    .val1 = 20,
    .val2 = 2000
};

配置存储在我要从中加载它的 eeprom 内存中。我不确定在 avr gcc 或 C 中是否有共同的规则保证当我使用 eeprom_read_block 复制到另一个内存部分的 ram 时 bot 结构布局将相同。我想确保这在任何情况下都不会中断,并且内存布局是相同的而不取决于部分。

AVR 是一个 8 位 MCU,因此就 CPU 而言,它没有对齐要求。此特定系统上不应有 struct 填充。

闪存和 EEPROM 可能有对齐要求,与它们的内存扇区有关,但这仅与驱动程序写入这些区域有关。它不影响编译器如何分配 struct

I'm not sure if there is a rule in avr gcc or C in common which guarantees that bot struct layouts will be the same when I use eeprom_read_block for copy into ram which is another memory section.

是的,无论存储在何处,结构在整个程序中始终具有相同的内存布局。这是由 C 标准保证的。

RAM 和 EEPROM 可能有不同的对齐要求,但没有 "magic behind the lines" 处理 - 在编写 flash/EEPROM 驱动程序时,您必须手动处理这种情况。