Если вы используете ARM7TDMI, избегайте обращения к памяти без выравнивания любой ценой .
Базовое ядро ARM7TDMI не имеет проверки выравнивания и будет возвращать повернутые данные, когда вы выполняете чтение без выравнивания. В некоторых реализациях есть дополнительные схемы для вызова исключения ABORT
, но если у вас нет одной из этих реализаций, поиск ошибок из-за невыровненного доступа очень болезнен.
Пример:
const char x[] = "ARM7TDMI";
unsigned int y = *reinterpret_cast<const unsigned int*>(&x[3]);
printf("%c%c%c%c\n", y, y>>8, y>>16, y>>24);
- На процессоре x86 / x64 выводится «7TDM».
- На процессоре SPARC это сбрасывает ядро с ошибкой шины.
- На процессоре ARM7TDMI это могло бы напечатать что-то вроде "7ARM" или "ITDM", предполагая, что переменная "x" выровнена на 32-битной границе (которая зависит от того, где находится "x" и какие параметры компилятора используются и т. д.), и вы используете режим с прямым порядком байтов. Это неопределенное поведение, но гарантированно не будет работать так, как вы хотите.