Структурировать упаковку в разных разделах памяти на AVR - PullRequest
0 голосов
/ 16 мая 2019

Существует следующая структура:

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, который является другим разделом памяти.Я хочу убедиться, что это не сломается ни при каких обстоятельствах, и расположение памяти одинаково и не зависит от раздела.

1 Ответ

5 голосов
/ 16 мая 2019

AVR - это 8-битный MCU, поэтому он не имеет требований к выравниванию в отношении процессора.В этой конкретной системе не должно быть заполнения struct.

Flash и EEPROM могут иметь требования к выравниванию, связанные с их секторами памяти, но это относится только к драйверам, записывающим в такие области.Это не влияет на то, как компилятор выделяет struct.

Я не уверен, есть ли в avr gcc или C общее правило, которое гарантирует, что макеты структуры ботов будут такими же, когда я использую eeprom_read_block для копирования в ram, который является другим разделом памяти.

Да, структура всегда будет иметь одинаковую структуру памяти во всей программе, независимо от того, где она хранится.Это гарантировано стандартом C.

ОЗУ и ЭСППЗУ могут иметь разные требования к выравниванию, но нет никакой «магии за линией», которая могла бы быть обработана - вам придется обрабатывать ее вручную в таких случаях при кодировании драйвера флэш-памяти / ЭСППЗУ.

...