LDR指令-CortexM7上的未使用错误

时间:2019-06-17 21:42:59

标签: assembly arm embedded cortex-m thumb

我正在调试为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应该没有任何对齐要求,因此我无法理解其原因。

1 个答案:

答案 0 :(得分:1)

对齐错误可能与LDR指令无关。向量表未对齐似乎是罪魁祸首。检查表是否至少在128字节边界上。如果不是,则向量提取可能是故障的实际来源。

此外,您的清单显示align 0x128,但该指令通常需要2的幂。应该改为align 128吗?