【问题标题】:Address of interrupt handler in interrupt vector is +1 of actual address中断向量中的中断处理程序地址是实际地址的+1
【发布时间】:2015-02-21 15:48:54
【问题描述】:

我为 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>
     .......

【问题讨论】:

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


    【解决方案1】:

    我在ARMv7-M架构参考手册,向量表定义(B1.5.3)一节找到了答案:

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

    【讨论】:

    • 长话短说,位 0 定义指令处于拇指模式。阿法克。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2017-10-29
    • 2019-06-08
    • 1970-01-01
    • 2014-07-28
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多