在AVR的不同内存部分中进行结构打包

时间:2019-05-16 07:47:19

标签: c struct embedded alignment 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结构的布局是相同的。我想确保这在任何情况下都不会中断,并且内存布局是相同的,而不取决于部分。

1 个答案:

答案 0 :(得分:5)

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

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

  

我不确定avr gcc或C中是否存在共同的规则,以确保当我使用eeprom_read_block复制到另一个内存部分ram时,bot结构布局将相同。

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

RAM和EEPROM可能有不同的对齐要求,但是并没有处理“线下魔术”的问题-在编写闪存/ EEPROM驱动程序时,您必须手动处理这种情况。