Цитата(johnshadow @ Oct 25 2016, 09:30)

я так и не понял почему компилятор не обрабатывает такие ситуации сам (gcc-arm-embedded 5.4 2016q2). может кто из местных объяснит.
Потому что компилятор априори верит что программист знает что делает, если есть явное указание на операцию. Зря конечно верит

. Ну а вы сами же и привели к указателю на 2ухбайтное значение, которое опять же должно быть выровнено. Кстати патч на мой вкус не очень. В таких случая лучше либо использовать memcpy (в релизе его соптимизируют в инлайн), либо код вроде такого:
Код
typedef struct {
uint16_t value;
} __attribute__((packed)) unaligned_uint16;
((unaligned_uint16*)bla_bla).value = ...;
В вашем решении много битовых операций на ровном месте.