异常与中断

对于M4/3处理器编译程序的时候就把异常向量表设置好烧写在flash上,cpu执行程序时每执行完一条指令,就会判断有没有中断产生。如果有中断产生,就会终止下一条指令,跳过去执行处理异常和中断,首先保存现场,把当前程序所涉及的寄存器保存在栈中,由硬件来实现的,使用异常和中断 在向量表找到一项,跳去执行函数,返回触发恢复现场。

对于A7发生中断,硬件上决定切换模式IRQ,跳转执行相关模式代码。软件上保存现场,保存在栈中,分配中断源然后处理最后恢复现场。

不同:

对于M4/3处理器首先向量表对于每个异常都放有处理函数,而对于A7呢,对于对于某一类异常在向量表放一个总入口里面放一个跳转指令。当发生中断时,M3/4硬件上帮你做了很多事,保存现场,分辨中断源,帮你去向量表去执行对应函数,即使恢复现场,也是软件触发,硬件执行恢复,软件只要提供处理函数就行。

而对于A7硬件只切换cpu模式,只帮你跳转执行异常向量表中某条指令,剩下的保存现场,分辨中断源,恢复现场都是软件来做的。

M4/3处理器在向量表放置的是函数地址
A7在向量表上放置的是跳转指令。

当函数A调到函数B

R0-R3 4个寄存器用来调用者和被调用者传递参数,函数A给函数B传递参数,函数B执行完后可以通过R0返回给函数A。 R0-R3通过函数A保存,函数B可以任意的使用R0-R3别指望它们的值不变了。这些寄存器被称为调用者保存寄存器。

R4-R11 函数B可能使用,用到哪个寄存器就保存原来的值,所以在函数B入口保存它们,在函数B出口恢复它们,这些寄存器称为被调用保存寄存器。

EXIT 外部中断控制器
NVCI 中断控制器
GIC 通用中断控制器

GIC还可以把哪个中断源发给哪个cpu CPU0或1,CPU来处理中断。

*当发生中断时有状态寄存器,我们可以读取状态寄存器来判断是否发生中断,并且处理完中断后清除中断标志寄存器。
NVIC它是中断控制器,它的中断源有来自很多种,有EXIT外部中断,有串口,定时器中断其他模块中断源,NVIC的职责就是从多个中断源中取出优先级

ISER寄存器有32位,每一位对应一个中断,比如Bit[0]用于异常16对应向量表如下图

GIC用于管理单核或多核芯片中的中断资源

  • ARM公司开发了4 个版本GIC规范 ,V1~V4
  • ARMv7-A内核搭配GIC-400使用

    异常与中断

    中断向量表

    ARMv7-A

    一级查表

    自动跳转指定位置(基址+偏移)

    addr TYPE FUNCTION MODE
    0x00 Reset 复位中断 SVC
    0x04 Undefined instructions 未定义指令中断 Undef
    0x08 Supervisor Call 软中断 SYC
    0x0C Prefetch abort 指令预取中止中断 ABT
    0x10 Data abort 数据访问中止中断 ABT
    0x14 RESERVED 未使用 未使用
    0x18 IRQ interrupt IRQ 中断 IRQ
    0x1C FIQ interrupt FIQ 中断 FIQ
    二级查表,执行中断函数

    预先注册、回调执行

    中断处理流程

    中断上下文

    cpu通过内核寄存器来运行指令并进行数据的读写处理的,它在进入中断前一个时刻的具体值,称为中断上下文

    具体流程

    • 初始化irq模式栈指针

    • 进入irq模式

      • cpsr寄存器
    • 保存现场

      • 通用寄存器
      • lr
      • spsr
    • 获取中断编

      • 读取GIC基地址
      • GICC基地址(GIC cpu interface)
      • GICC_IAR寄存器
    • 执行中断处理函数

      • 根据中断编 ,回调IRQ中断服务表
    • 还原现场

      • 通用寄存器

      • lr

      • spsr

    • 返回原程序

      • 三级流水线

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年2月22日
下一篇 2022年2月22日

相关推荐