中断向量中的中断处理程序地址是实际地址的+1

时间:2015-02-21 15:48:55

标签: memory exception-handling linker interrupt-handling cortex-m3

我交叉编译了一个cortex-m3的程序。在启动代码中,所有中断都在g_pfnVectors中给出。当我反汇编时,在地址0x0,我看到“堆栈指针值”。比地址0x4复位中断处理程序地址给出。这继续使用以下系统中断地址。

这是我的问题:为什么在中断向量中,中断处理程序的地址是实际地址的+1。 ResetISR处理程序的地址是0x184,但在中断表中它是0x185。所有其他中断处理程序地址都是这种情况。这是什么原因?

    00000000 <g_pfnVectors>:
       0:   10008000    andne   r8, r0, r0
       4:   00000185    andeq   r0, r0, r5, lsl #3
       8:   00000215    andeq   r0, r0, r5, lsl r2
       c:   0000021d    andeq   r0, r0, sp, lsl r2

    00000184 <ResetISR>:
     184:   b580        push    {r7, lr}
     186:   b084        sub sp, #16
     188:   af00        add r7, sp, #0
     .......

    00000214 <NMI_Handler>:
     214:   b480        push    {r7}
     216:   af00        add r7, sp, #0
     218:   e7fe        b.n 218 <NMI_Handler+0x4>
     21a:   bf00        nop
     .......
    0000021c <HardFault_Handler>:
     21c:   b480        push    {r7}
     21e:   af00        add r7, sp, #0
     220:   e7fe        b.n 220 <HardFault_Handler+0x4>
     .......

1 个答案:

答案 0 :(得分:3)

我在ARMv7-M架构参考手册的矢量表定义(B1.5.3)部分找到了答案:

  

Vector表必须自然地与2的幂对齐   对齐值大于或等于(异常数)   支持x 4),最小对齐为128个字节。开机或开机   reset,处理器使用偏移量0处的条目作为初始值   对于SP_main,请参见第B1-572页的SP寄存器。 所有其他条目   必须将位[0]设置为1,因为该位定义了EPSR.T位   例外条目。请参阅第B1-586页的重置行为和异常   有关更多信息,请参阅第B1-587页上的输入行为例外   如果相关向量表条目的位[0]设置为0,则输入   执行第一条指令会导致INVSTATE UsageFault,请参阅   专用程序状态寄存器,第B1-572页上的xPSR和   第B1-608页的故障行为。如果在重置时发生这种情况,这个   升级到HardFault,因为在重置时禁用了UsageFault,请参阅   有关更多信息,请参阅第B1-585页的优先级升级。