我交叉编译了一个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>
.......
答案 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页的优先级升级。