Доброго времени суток.
начну с кода:
char arr[16]; int *pi1 = (int*)arr[0]; int *pi2 = (int*)arr[1]; int *pi3 = (int*)arr[2]; int *pi4 = (int*)arr[3]; *pi1 = 0x11223344; *pi2 = 0x11223344; *pi3 = 0x11223344; *pi4 = 0x11223344;
среда IAR 6.30.1
в результате запись происходит по адресам со сдвигом влево до границы кратной размеру адресуемого типа. это смотрел через J-Link в листинге каждая запись производится инструкцией STR R0, [Rx]... при чем в Rx лежат правильные значения с шагом в 1 байт.
тот же результат в uVision 4
если же запустить отладку в симуляторе, то при каждой записи по не кратному адресу вылетает сообщение "STR instruction at addr: 0x40006835 made an illegal unaligned access to 0x40006835"
информации о том, что адрес должен быть выровнен для STR/LDR по 4 байтам для STRH/LDRH по 2 байта я не нашел. пусть даже должен быть выровнен. почему компилятор не преобразует команду записи по указателю в набор инструкций с побайтовой записью, учитывая специфику адресации?
|