如果在复位处理程序中调用主函数,其他中断如何处理?

1 c embedded arm

这是 Tiva C 启动代码的示例代码,正如您所看到的,主函数是在重置处理程序内部调用的,据我所知,它是最高优先级的,所以我的问题是,如果我们还在重置处理程序中吗?

```
; Reset Handler

Reset_Handler   PROC
            EXPORT  Reset_Handler             [WEAK]
            IMPORT  SystemInit
            IMPORT  __main
            LDR     R0, =SystemInit
            BLX     R0
            LDR     R0, =__main
            BX      R0
            ENDP
```
Run Code Online (Sandbox Code Playgroud)

Cli*_*ord 5

重置是“特殊的”。当处理器复位调用复位处理程序时,指令以线程模式执行。必然如此,因为复位向量是在上电复位 (POR) 时调用的 - 如果处理程序必须“返回”,它将返回到哪里?

此外,在任何情况下复位时,寄存器都会重置为其定义的重置状态,并且堆栈指针设置为表开头的地址(至少在 ARM Cortex-M 的情况下),因此将无处可去获取返回地址 - 事实上,复位信号在任何情况下都不会导致返回地址被堆栈。重置的全部目的是在已知状态下重新启动处理器。返回到重置发生的点没有什么意义,并且由于处理器的重置状态不太可能是“中断”代码的合适运行状态,因此不太可能起作用。

ARM Cortex-M3 用户指南(我的重点)来看,其他 ARM 架构可能在细节上有所不同,但总体上没有差异。

2.3.2. 异常类型异常类型有:

重置

复位在加电或热复位时调用。异常模型将重置视为一种特殊形式的异常。当复位被置位时,处理器的操作可能会在指令中的任何点停止。当复位无效时,将从向量表中复位条目提供的地址重新开始执行。执行以线程模式下的特权执行重新启动。 [...]