Был проект на микроконтроллере STM32F4. Перенёс на STM32F0 (упрощённая модель). Не весь, конечно, только нужные части. Не запускается. Хардфолт.
Копание в ассемблере показало, что хардфолт происходит при косвенной адресации по адресу, который вполне обычен. Он расположен в доступной области и по нему есть данные. Единственная особенность адреса -- он был нечётным!
Это был адрес начала "сегмента данных". Программа занимала 17189 байт, поэтому данные-инициализаторы располагались начиная с адреса 0x08004325. Чтобы заставить расположить программу данные начиная с чётного адреса, мне пришлось вручную поправить скрипт линковщика (у меня это arm-gcc-link.ld), написав там в начале сегмента данных .=ALIGN(4) (что означат: выровнять текущий адрес по границе 4-байтных слов). Я на всякий случай решил выровнять сразу по 4 байта, а не по 2.
После этого всё заработало. То есть, младшая модель микроконтроллера не умеет работать с данными по нечётным адресам. Это не нонсенс. Современные и мощные контроллеры/процессоры, естественно, работают с данными по любым адресам. Но это не получается само собой. В них встроен специальный блок, который прозрачно для пользователя считывает два слова, равных разрядности процессора, с адресами до и после нужного, а потом склеивает из них конечное число. Получается немного медленнее.
А в этой модели микроконтроллера блок нечётных адресов вырезали.
Вообще-то, среда разработки (у меня это заброшенный разработчиками CooCox IDE) должна знать о таких вещах, коли уж она при задании целевого микроконтроллера автоматически подставляет его размеры RAM и