Соответственно, если используешь packed - обычно компилятор сам генерирует правильную команду для доступа к памяти. Важно помнить следующее:
Побайтный доступ - всегда выровнен. Но считывает не более байта
Доступ к полуслову - должен быть выровнен на 2, вычитывает uint16_t
Доступ по слову - выровнен на 4 должен быть, считывает. uint32_t
Сдуру можно создать такие условия:
Struct {
uint8
uint8
uint8
uint16
uint8
uint32
}
Упакованная структура на некоторых компиляторах может и к падению привести в хардфолт