Cortex-M7 异常处理与返回

1 前言

        当CM3开始响应一个中断时,会在它小小的体内奔涌起三股暗流:
         入栈: 把8个寄存器的值压入栈;
         取向量:从向量表中找出对应的服务程序入口地址;
         选择堆栈指针MSP/PSP,更新堆栈指针SP,更新LR,更新程序计数器PC;
                                                                 ---引自《Cortex-M3权威指南》

        为了提高异常响应的实时性,Cortex-M7采用了如下机制:

        ① 支持基于优先级的中断抢占

        即便CPU当前正在进行异常处理,当新到异常的优先级较高时,即可进行抢占,转而处理该优先级较高的异常,即支持中断嵌套处理;

        ② 异常返回

        如果当前无尚pending等待响应的异常,且没有被晚到(late-arriving)机制打断,当前异常处理完成后,就会进行异常返回;

        ③ 尾链机制(咬尾中断,tail-chaining)

        为了加速异常响应速度,当一个异常处理完成后,如果还有处于pending状态的异常等待响应,则不会进行堆栈恢复,而是转而处理该pending的异常;

        ④ 晚到机制(late-arriving)

        该机制主要是为了加速优先级抢占;若当前异常(A)响应正处于现场保护(压栈,保护现场等操作异常处理准备阶段),而新到一个优先级更高的异常B,则之前的准备工作都变成了为他人做嫁衣了,当然这些准备工作也不会浪费(这些准备工作也是新到的异常B处理所必须的),CPU会转而处理该优先级较高的异常,进行其对应的中断向量取指工作,待到异常B处理完成后,尾链机制生效,继续处理异常A;

        当然,这种半路截胡的事情只限于异常处理准备阶段,一旦异常A进入异常处理(开始执行ISR),则只能按照普通的抢占处理,这就意味着需要进行当前异常处理的现场保护,需要更多的CPU耗时和压栈处理。

        总的来看,整个异常处理过程可大概理解为图1的流程:

        图1 异常处理过程

2 异常响应的具体行为分析

2.1 异常响应

        一个异常能够得到CPU响应的情况,主要分为以下两种:

        ① 异常来临时,CPU处于线程模式(Thread mode),抢的毫无悬念;

        ②异常来临时,CPU正在处理异常,但新到异常的优先级更高,照抢不误;

        当然,以前描述的情况都是在异常没有被屏蔽的情况下讨论的,PRIMASK, FAULTMASK以及BASEPRI是三个可以用于异常使能或除能的特殊功能寄存器。

2.2 压栈

        如果当前异常不是以晚到机制或尾链机制进行处理的,那么在毕竟要亲自动手进行异常处理前的准备活动,包括保护现场,对诸多寄存器进行压栈(依次把xPSR, PC, LR, R12以及R3-R0由硬件自动压入适当的堆栈中),这8个寄存器由硬件(强制)自动完成压栈,其集合称之为栈帧(stack frame)。当Cortex-M7选配的FPU使能时,同时也需要对FPU相关寄存器进行压栈处理,具体如图2所示。

​图2 stack frame

        其中:

        ① 栈帧中PC存储的是中断返回后执行的地址,为被中断打断的程序的下一条指令地址;

        ② 压栈等准备工作完成后,若没有被更高优先级的中断抢占,则正式进入中断处理阶段,该中断的状态会从pending变为active,开始执行ISR;反之,若新到一个更高优先级的异常,则该中断的状态会停留在pending状态,CPU会转而处理该新到异常;

        此外,在进入ISR前,xPSR, PC, LR, R12以及R3-R0由硬件自动压入适当的堆栈(MSP或PSP)中,而其他寄存器如果由保护需求,则需要在ISR中手动入栈。例如,PortPendSVHandler代码中r4-r11,r14及FPU相关寄存器的相关入栈操作就是在ISR中完成的:

void xPortPendSVHandler( void )
{
    /* This is a naked function. */
 
    __asm volatile
    (
        "	mrs r0, psp							\n"
        "	isb									\n"
        "										\n"
        "	ldr	r3, pxCurrentTCBConst			\n"/* Get the location of the current TCB. */
        "	ldr	r2, [r3]						\n"
        "										\n"
        "	tst r14, #0x10						\n"/* Is the task using the FPU context?  If so, push high vfp registers. */
        "	it eq								\n"
        "	vstmdbeq r0!, {s16-s31}				\n"
        "										\n"
        "	stmdb r0!, {r4-r11, r14}			\n"/* Save the core registers. */
        "	str r0, [r2]						\n"/* Save the new top of stack into the first member of the TCB. */
        "										\n"
        "	stmdb sp!, {r0, r3}					\n"
        "	mov r0, %0 							\n"
        "	cpsid i								\n"/* Errata workaround. */
        "	msr basepri, r0						\n"
        "	dsb									\n"
        "	isb									\n"
        "	cpsie i								\n"/* Errata workaround. */
        "	bl vTaskSwitchContext				\n"
        "	mov r0, #0							\n"
        "	msr basepri, r0						\n"
        "	ldmia sp!, {r0, r3}					\n"
        "										\n"
        "	ldr r1, [r3]						\n"/* The first item in pxCurrentTCB is the task top of stack. */
        "	ldr r0, [r1]						\n"
        "										\n"
        "	ldmia r0!, {r4-r11, r14}			\n"/* Pop the core registers. */
        "										\n"
        "	tst r14, #0x10						\n"/* Is the task using the FPU context?  If so, pop the high vfp registers too. */
        "	it eq								\n"
        "	vldmiaeq r0!, {s16-s31}				\n"
        "										\n"
        "	msr psp, r0							\n"
        "	isb									\n"
        "										\n"
        #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */
            #if WORKAROUND_PMU_CM001 == 1
                "			push { r14 }				\n"
                "			pop { pc }					\n"
            #endif
        #endif
        "										\n"
        "	bx r14								\n"
        "										\n"
        "	.align 4							\n"
        "pxCurrentTCBConst: .word pxCurrentTCB	\n"
        ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )
    );
}

2.3 异常返回

        在异常处理模式(Handler mode)下,将EXC_RETURN加载至PC,则会触发异常返回,通常有以下三种方式:

• An LDM or POP instruction that loads the PC.
• An LDR instruction with PC as the destination.
• A BX instruction using any register.

        在ISR执行前,EXC_RETURN的值会被存储到LR,用于指示中断返回后使用的堆栈指针(MSP还是PSP)及处理器模式(线程模式还是异常处理模式),一旦EXC_RETURN被加载到PC,则标志着ISR执行完毕,随即触发中断返回序列。EXC_RETURN的bits[31:5]恒为1,而低5位用于存储返回信息,具体见表1:

表1 EXC_RETURN定义的异常返回行为

  • 45
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Cortex-M7编程手册是指针对ARM公司推出的Cortex-M7内核的编程指南。Cortex-M7是一种高性能、高效能的嵌入式处理器,被广泛应用于物联网、汽车、工业控制以及消费电子等领域。 Cortex-M7编程手册的目的是向开发人员提供有关如何优化使用Cortex-M7的信息和指导。该手册详细介绍了Cortex-M7内核的功能、寄存器和指令集,帮助开发人员了解处理器的架构和工作原理。 手册首先介绍了Cortex-M7的特性和优势,例如高性能时钟系统、深度流水线、硬件分析和调试等。然后,手册介绍了处理器的主要寄存器,包括通用寄存器、特殊寄存器和控制寄存器等,开发人员可以了解如何使用这些寄存器来配置和控制处理器的运行。 手册还详细介绍了Cortex-M7的指令集和编程模型。通过学习指令集和指令的编码方式,开发人员可以编写高效的程序来充分发挥处理器的性能。此外,手册还提供了一些面向特定应用场景的编程示例,帮助开发人员理解如何在实际应用中使用Cortex-M7。 最后,手册还介绍了一些优化技巧和调试方法,帮助开发人员进一步提升程序的性能和可靠性。通过深入理解Cortex-M7的内部结构和工作原理,开发人员可以通过合理的软件设计和编程方法来优化程序的执行效率。 总之,Cortex-M7编程手册是一本对于想要了解和开发基于Cortex-M7的嵌入式系统的开发人员来说非常有价值的参考书。它提供了全面的指导和信息,帮助开发人员充分发挥Cortex-M7处理器的性能。 ### 回答2: Cortex-M7编程手册是一本关于ARM Cortex-M7处理器编程的指南手册。它提供了关于这款处理器的详细技术资料和编程指令,以帮助工程师更好地理解和利用Cortex-M7处理器的性能和功能。手册的内容主要包括以下几个方面。 首先,手册介绍了Cortex-M7处理器的架构和特点。它详细解释了处理器的组成部分,包括核心、寄存器、存储器系统和外设。通过了解这些组成部分的工作原理,开发者可以更好地理解Cortex-M7处理器的内部结构和运行机制。 然后,手册介绍了Cortex-M7处理器的编程模型和指令集。编程模型是指处理器的寄存器和内存布局,以及程序执行的规则。指令集包括处理器支持的各种操作和功能的指令。手册会详细介绍常见的指令,如数据传输指令、算术运算指令、逻辑运算指令等。通过学习这些指令,开发者可以编写高效和功能强大的Cortex-M7程序。 此外,手册还介绍了Cortex-M7处理器的中断和异常处理机制。中断是指处理器在执行程序时遇到的事件,如外部设备的输入信号或定时器的触发。异常是指程序运行时发生的错误或异常情况。手册会详细介绍中断和异常处理流程,以及如何编写中断服务程序和异常处理程序。 最后,手册提供了一些示例代码和开发工具的介绍,以帮助开发者更好地使用Cortex-M7处理器。这些示例代码可以作为学习和参考的资源,开发工具则可以提供更方便的开发环境和调试功能。 总之,Cortex-M7编程手册是一本帮助开发者理解和使用Cortex-M7处理器的重要参考资料。通过学习和掌握手册中的内容,开发者可以编写出高效、功能强大的Cortex-M7程序,实现各种应用需求。 ### 回答3: Cortex-M7编程手册是一本专门针对Cortex-M7处理器的编程指南,旨在帮助开发者更好地理解和使用Cortex-M7处理器。 该手册首先介绍了Cortex-M7处理器的架构和核心特性。Cortex-M7是一款高性能而低功耗的微控制器处理器,采用了ARMv7-M架构,并支持Thumb-2指令集。手册详细说明了Cortex-M7处理器的指令集,包括地址模式、数据处理指令、逻辑指令、分支指令等,开发者可以根据手册中的信息来编写针对Cortex-M7处理器的汇编程序。 此外,手册还介绍了Cortex-M7处理器的内存管理单元(MMU)和保护单元(MPU),并详细说明了如何配置和使用它们。MMU和MPU可以有效地保护系统的安全性和稳定性,开发者可以根据手册中的指导来配置和优化内存管理和保护机制。 此外,手册还介绍了如何在Cortex-M7处理器上进行外设编程,包括串口、SPI、I2C等常见外设的编程方法。手册还涵盖了中断处理、系统调试和性能优化等方面的内容,开发者可以根据手册中的指导来实现高效的系统设计和调试。 总之,Cortex-M7编程手册是一本涵盖了Cortex-M7处理器架构、指令集和各种编程技术的全面指南。通过学习和应用该手册,开发者可以更好地理解和使用Cortex-M7处理器,从而开发出更高效、稳定的嵌入式系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值