Я отлаживаю код сборки, написанный для цели CortexM7. Внутри обработчика busFault есть инструкция LDR, которая при выполнении вызывает НЕПРАВИЛЬНУЮ сбой использования и, как следствие, происходит принудительный сбой. Что я знаю, так это то, что по умолчанию для инструкции ldr не требуется выравнивание адресов.
Я также проверил бит в регистре CCR, который может обеспечить выполнение требования, но он отключен.
Вот мой код:
global c_AbcFunction
c_Abc .long c_AbcFunction
BusFaultHandler:
LDR R1, c_Abc
Компилятор: ARM-GHS 2017
Отладчик: Лаутербах
Значение CCR:
CCR 00040200 BP Enabled IC Disabled DC Disabled
STKALIGN 8-byte/adjustment BFHFNMIGN Lockup DIV_0_TRP Disabled
UNALIGN_TRP Disabled USERSETMPEND Disabled NONBASETHRDENA Disabled
Разборка вышеуказанного кода:
0128 c_Abc: align 0x128
2802 //////// ; instruction would span across HLL line symbol
BusFaultHandler:
LDR R1, c_Abc
F85F102E ldr r1,0x10013318
Изменение, внесенное мной для строгого выравнивания:
c_Abc .long c_AbcFunction
.align 4
Разборка после добавления ".align 4":
28020128 c_Abc: stmdacs r2,{r3,r5,r8}
BusFaultHandler:
LDR R1, c_Abc
F85F1030 ldr r1,0x10013318 ; r1,c_Abc
Основная проблема каким-то образом решается добавлением .align 4. Но я не могу понять причину, поскольку LDR не должен иметь никаких требований по выравниванию в текущем сценарии.