我正在调试为CortexM7目标编写的汇编代码。在busFault处理程序中,有一条LDR指令,该指令执行时会引起UNALIGNED Usage Fault(使用错误),结果发生强制的Hard Fault。我知道的是,默认情况下,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应该没有任何对齐要求,因此我无法理解其原因。
答案 0 :(得分:1)
对齐错误可能与LDR
指令无关。向量表未对齐似乎是罪魁祸首。检查表是否至少在128字节边界上。如果不是,则向量提取可能是故障的实际来源。
此外,您的清单显示align 0x128
,但该指令通常需要2的幂。应该改为align 128
吗?