Делайте как написал выше: большие элементы сначала. Спокойно
пакуйте. Если переживаете, добавьте __attribute__((aligned)) в
определении структуры. Я вообще делаю так: декларирую упакованную структуру. Потом объединяю её в союз с массивом байт размером sizeof(тип_структуры). И определяю этот союз с выравниванием с атрибутом aligned. Имею доступ к элементам структуры по именам, а для работы с ЭСПЗУ - как к массиву байт известного размера.
При таком подходе (от больших к меньшим), даже если компилятор намудрит и понавырвавнивает, меняется лишь размер массива байт, но доступ не ломается.
Впрочем, с GCC, пока не случалось, чтобы не до конца упаковал.