Столкнулся с "интересным" поведением программы под KEIL 4.23, процессор EFM32G210F128:
Код
void func(void *p)
{
long *ptr = p;
...
*ptr++ = variable;
...
}
{
long *ptr = p;
...
*ptr++ = variable;
...
}
приводит к исключению. В ассемблере это инструкция STM R5!, {R0}.
Код
void func(void *p)
{
long *ptr = p;
...
*ptr = variable;
ptr++;
...
}
{
long *ptr = p;
...
*ptr = variable;
ptr++;
...
}
работает нормально. Там генерируется:
Код
STR R0, [R5, #0x00]
ADDS R5,R5,#4
ADDS R5,R5,#4
В описании инструкции STM я не нашел упоминания, что регистр-указатель приемника должен быть выровнен на слово, а похоже именно это требуется. У меня же через void *p передается указатель на некий буфер обмена, который может содержать различные данные, а сам буфер в итоге где-то в стеке как локальная переменная внутри функции, которая и вызывает мою. Очевидно, что локальные переменные там не выровнены.
Что скажете? Мой недосмотр или грабли, подложенные KEIL?