Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果在重置处理程序内调用main函数,那么其他中断是如何处理的?_C_Arm_Embedded - Fatal编程技术网

C 如果在重置处理程序内调用main函数,那么其他中断是如何处理的?

C 如果在重置处理程序内调用main函数,那么其他中断是如何处理的?,c,arm,embedded,C,Arm,Embedded,这是Tiva C启动代码中的一个示例代码,正如您所看到的,主函数在重置处理程序中调用,据我所知,它是最高优先级的,所以我的问题是,如果我们仍然在重置处理程序中,如何处理任何其他中断 ``` ; Reset Handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main

这是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
```

我发现ARM架构参考手册中的伪代码对于回答这类问题非常有帮助。通过“tiva c”,我假设您所说的是基于Cortex-M4的MCU的TM4C系列微控制器。这意味着,我们将要查看

“B1.5.5重置行为”部分包含我们感兴趣的伪代码。以下是一个片段(省略了与问题无关的部分):

断言重置会导致处理器放弃当前执行
声明而不保存它。在解除复位时,所有寄存器
具有定义的重置值的包含该值,并且处理器
执行TakeReset()伪代码描述的操作。
//TakeReset()
// ============
TakeReset()
CurrentMode=Mode\u线程;
PRIMASK='0';/*重置时优先级掩码被清除*/
FAULTMASK='0';/*复位时清除故障屏蔽*/
BASEPRI=零(8);/*重置时禁用基本优先级*/
// [...]
从描述中我们可以注意到:

  • 如果系统正在运行并发出重置,处理器将始终“放弃当前执行”。因此,如果MCU正在运行,这是可能发生的“最高优先级”的事情
  • 但是,在MCU重新启动并且“TakeReset”逻辑开始运行后,处理器进入的“CurrentMode”实际上是线程模式。ARMv7-M有两种操作模式,即线程模式处理程序模式。所有中断/异常都在处理程序模式下运行,正常代码在线程模式下运行。这告诉我们重置路径不会像中断/异常那样启动。它就像普通代码一样运行

  • 我发现ARM架构参考手册中的伪代码对于回答这类问题非常有帮助。通过“tiva c”,我假设您所说的是基于Cortex-M4的MCU的TM4C系列微控制器。这意味着,我们将要查看

    “B1.5.5重置行为”部分包含我们感兴趣的伪代码。以下是一个片段(省略了与问题无关的部分):

    断言重置会导致处理器放弃当前执行
    声明而不保存它。在解除复位时,所有寄存器
    具有定义的重置值的包含该值,并且处理器
    执行TakeReset()伪代码描述的操作。
    //TakeReset()
    // ============
    TakeReset()
    CurrentMode=Mode\u线程;
    PRIMASK='0';/*重置时优先级掩码被清除*/
    FAULTMASK='0';/*复位时清除故障屏蔽*/
    BASEPRI=零(8);/*重置时禁用基本优先级*/
    // [...]
    
    从描述中我们可以注意到:

  • 如果系统正在运行并发出重置,处理器将始终“放弃当前执行”。因此,如果MCU正在运行,这是可能发生的“最高优先级”的事情
  • 但是,在MCU重新启动并且“TakeReset”逻辑开始运行后,处理器进入的“CurrentMode”实际上是线程模式。ARMv7-M有两种操作模式,即线程模式处理程序模式。所有中断/异常都在处理程序模式下运行,正常代码在线程模式下运行。这告诉我们重置路径不会像中断/异常那样启动。它就像普通代码一样运行
  • 重置为“特殊”。当处理器重置调用重置处理程序时,指令以线程模式执行。必然如此,因为重置向量是在通电重置(POR)时调用的——如果处理程序必须“返回”,它将返回到哪里

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

    与(myemphasis)不同的是,其他ARM体系结构可能在细节上有所不同,但在一般意义上并不相同

    2.3.2。异常类型异常类型包括:

    重置

    在通电或热复位时调用Reset。异常模型将重置视为异常的一种特殊形式。当重置被断言时, 处理器的操作可能会在系统中的任何点停止 指示当重置被解除断言时,执行将从 向量表中重置项提供的地址执行 以线程模式作为特权执行重新启动。 [……]

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

    在任何情况下,寄存器在重置时都会重置为其定义的重置状态,堆栈指针设置为表开始处的地址(至少在am ARM Cortex-M的情况下),因此没有任何地方可以获取返回地址-事实上,重置信号是这样做的
    Asserting reset causes the processor to abandon the current execution 
    state without saving it. On the deassertion of reset, all registers 
    that have a defined reset value contain that value, and the processor
    performs the actions described by the TakeReset() pseudocode.
    
    // TakeReset()
    // ============
    TakeReset()    
        CurrentMode = Mode_Thread;
        PRIMASK<0> = '0'; /* priority mask cleared at reset */
        FAULTMASK<0> = '0'; /* fault mask cleared at reset */
        BASEPRI<7:0> = Zeros(8); /* base priority disabled at reset */
        // [...]