Во-первых, обычно следует избегать упакованного выравнивания, если в результате вы получите данные, не выровненные по своим естественным границам, некоторые процессоры просто при попытке доступа к ним будут просто создавать ловушку.
Во-первых, сохраняйте элементы в порядке, чтобы компилятор не добавлял пробелы для выравнивания (или, если это так, добавляет его в конце).Если вы можете, у члена 1. должны быть требования к выравниванию, которые вы желаете - поскольку это заставляет компилятор по крайней мере дать структуре такое большое выравнивание.
Это требует некоторых знаний о том, как требования к выравниванию вашей платформы икомпилятор, например, избавиться от массива заполнения и изменить
typedef struct
{
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
uint8_t padding[...];
} CONFIG;
на
typedef struct
{
uint32_t blabla;
uint16_t delay;
uint8_t status;
uint8_t foo[5];
} CONFIG;
Затем скажите компилятору, что для этой структуры требуется 4-байтовое значение (в этом случае оно, вероятно, ужетак как первый элемент имеет 4-байтовое или более требование выравнивания).например, с использованием gcc attribute((__aligned__(4))
Затем напишите небольшую тестовую программу, которая проверяет ваши требования к выравниванию (это просто небольшая программа, которая использует sizeof () и alignof () в вашей структуре), этодаже сказать вам, если вам нужно добавить инструкцию для структуры для выравнивания.Запустите эту программу как часть сборки / упаковки.