ARM架构中异常与中断的处理简要阐述(M3/4与A7处理器中断的区别)

创建时间:2022/1/20 12:05
更新时间:2022/1/20 14:14
作者:gi51wa2j
标签:ARM, bingo, 计算机原理, 正文

一、 大致处理流程(基本一致)

  • 每执行完一条指令都会检查有无中断/异常产生

  • 发现有中断/异常产生,开始处理:

    • 保存现场

    • 分辨异常/中断,调用对应的异常/中断处理函数

    • 恢复现场

不同的芯片,不同的架构,在这方面的处理稍有差别:

  • CPU中止当前执行,跳转去执行处理异常的代码:也有差异

    • cortex M3/M4在向量表上放置的是函数地址

    • cortex A7在向量表上放置的是跳转指令

  • 保存/恢复现场:cortex M3/M4是硬件实现的,cortex A7是软件实现的

提出问题:

  1. CPU怎么跳去执行程序的

  1. 如何保存现场与恢复现场

二、 cortex M3/M4

参考资料:DDI0403E_B_armv7m_arm.pdf、ARM Cortex-M3与Cortex-M4权威指南.pdf、PM0056.pdf

要想理解这个处理流程,需要从向量表说起。 向量,在数学定义里是有方向的量,在程序里可以认为向量就是一个数组,里面有多个项。 在ARM架构里,对于异常/中断,它们的处理入口会整齐地排放在一起。

2.1 M3/M4的向量表

M3/M4的向量表中,放置的是具体异常/中断的处理函数的地址。 比如发生Reset异常时,CPU就会从向量表里找到第1项,得到Reset_Handler函数的地址,跳转去执行。(问题:CPU怎么知道调过来执行哪一个函数?由硬件确定,这时软件还没有运行) 比如发生EXTI Line 0中断时,CPU就会从向量表里找到第22项,得到EXTI0_IRQHandler函数的地址,跳转去执行。

  • 跳转之前,硬件会保存现场

  • 函数执行完毕,返回之后,硬件会恢复现场

2.2 M3/M4的异常/中断处理流程

发生异常/中断时,硬件上实现了这些事情:

  • 保存现场:把被中断瞬间的寄存器的值保存进栈里

  • 硬件分辨异常/中断,根据异常和中断号,从向量表中得到函数地址,跳转到向量表执行相应函数

  • 函数执行完后,从栈中恢复现场(软件触发,硬件恢复)

保存现场、分辨异常/中断、跳转执行,都是硬件实现的。 我们只需要在向量表中,把处理函数的地址填进去就可以了。

硬件承包了大部分的工作。

M3/M4的向量表中,存放的是函数地址

三、 cortex A7


参考资料:ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf

实际上,以前的S3C2440属于ARM9处理器,它的异常/中断处理流程给cortex A7是一样的。

3.1 A7的向量表

A7的向量表中,放置的是某类异常的跳转指令。 比如发生Reset异常时,CPU就会从向量表里找到第0项,得到b reset指令,执行后就跳转到reset函数。 比如发生任何的中断时,CPU就会从向量表里找到第6项,得到ldr pc, _irq指令,执行后就跳转到_irq函数。

  • 跳转之前,硬件只会保存CPSR寄存器

  • 跳转之后,软件要保存现场

  • 函数执行完毕,返回之前,软件恢复现场


3.2 A7的异常/中断处理流程

发生异常/中断时,硬件上实现了这些事情:

  • CPU切换到对应的异常模式,比如IRQ模式、未定义模式、SVC模式

  • 保存被中断时的CPSR到SPSR

    • CPSR:current program status register,当前程序状态寄存器

    • SRSR:saved program status register,保存的程序状态寄存器

  • 跳到这个异常的入口地址去,执行指令,这通常是一条跳转指令

软件要做的事情就比较多了:

  • 保存现场

  • 分辨异常/中断

  • 调用对应的处理函数

  • 恢复现场

A7的向量表中,存放的是跳转指令