ARMv7-R 架构中断处理流程 (TDA4VM/TDA4VH R5F 核中断处理流程)

8 篇文章 13 订阅
7 篇文章 2 订阅

(芯片平台为: TDA4VM / TDA4VH 的 MCU 域的 R5F 核)

Cortex-R5 IRQ/FIQ 中断处理方式

阅读《Cortex-R5 trm》, 得知 r5 服务一个中断的形式有下列两种方式:

  1. 通过 VIC 来服务一个中断,当 IRQ 发生时,r5 内核硬件自动从 VIC 中获取 IRQ 的中断服务程序的地址;
  2. 不使用 VIC,当 IRQ 发生后, 通过读写 VIM 寄存器的形式来服务一个中断,可以类比 Cortex-A7 架构中的中断处理形式,不过 Cortex-A7 使用的是 GICv2 的寄存器。

方式的选择由 SCTLR 寄存器的 bit24:VE 位控制,如下:
在这里插入图片描述

TRM 上对该位的解释如下:
在这里插入图片描述

两种中断服务形式的流程差别

通过 VIC 服务 IRQ/FIQ(一般使用该模式)

如果我们使用的 ARMv7-R 架构芯片内部集成了 VIC,那么,我们可以使用 VIC 来服务一个中断,也就是说,我们需要在启动汇编代码中,置位 SCTLR 寄存器的 VE 位。
TDA4VM/TDA4VH mcu 域 R5F 芯片内部就集成了 VIC。

当 irq 触发后,r5 内核不会将 pc 指针跳转到异常向量表的 0x00000018 或 0xFFFF0018 处,而是自动与 VIC 完成硬件握手,并直接从 VIC 中获取我们为每一个中断设置的中断服务地址。
VIC 为每一个中断源都提供了设置各自中断服务函数地址的寄存器,以 TDA4VM 举例, 各中断的向量地址寄存器 VIM_VEC_INT如下:
在这里插入图片描述

使用 VIC 服务中断的处理流程:

  1. 软件维护一个中断服务函数及其参数的结构体数组,每一个数组元素(结构体)对应一个中断向量。

  2. VIM 寄存器初始化,清除各中断状态,初始化中断优先级,中断映射类型(IRQ/FIQ),中断触发类型,失能所有中断。

  3. 维护一个总的 irq_handler,以及维护一个中断服务函数及其参数的结构体数组。

  4. 注册某一个中断的中断服务函数及其参数,到结构体数组中,并将总的 irq_handler 写入 VIM 的指定中断的向量地址寄存器 VIM_VEC_INT中,并使能指定中断。

  5. 中断触发后,r5 内核与 VIC 完成硬件握手,从之前我们设置的向量地址寄存器中获取中断服务函数地址,即 irq_handler。

  6. 读取活跃中断寄存器VIM_ACTIRQ,获取触发中断的向量号。
    在这里插入图片描述

  7. 根据向量号,从软件维护的结构体数组中,调用自定义的中断服务函数。

  8. 根据中断触发类型(电平/脉冲),清除中断标志位。
    在这里插入图片描述

  9. VIM_IRQVEC 寄存器中写任意值,表示中断处理结束。
    在这里插入图片描述

不使用 VIC 来服务一个 IRQ/FIQ(一般不使用该模式)

(不置位 SCTLR 寄存器的 VE 位)
之前提到,该种方式与 Cortex-A7 的中断处理流程类似,那么在这,带领大家回忆一下 Cortex-A7 的中断处理流程:

  1. 软件维护一个中断服务函数及其参数的结构体数组,每一个数组元素(结构体)对应一个中断向量。
  2. GICv2 初始化,初始化 cpu interface,比如设置合适抢占优先级(GICC_BPR);初始化 distributor,清除各中断状态,设置初始中断优先级,各中断分组,初始中断类型,中断绑核,失能所有中断。
  3. 注册某一个中断的中断服务函数及其参数到结构体数组中,并使能指定中断。
  4. 当中断触发后,pc 指针跳转到中断向量表中偏移量为 0x18 的地址处,再跳转到统一的 irq_handler。
  5. 在这个统一的 irq_handler 中,代码通过读取 cpu interface 的 GICC_IAR 寄存器来应答中断,并获取触发 IRQ 的中断向量号。
  6. 从数组中调用对应中断的中断服务程序,服务中断。
  7. 从指定的中断服务函数中退出,irq_handler 的代码写 GICC_EOIR 寄存器来通知 GIC 中断处理结束,然后退出。
  8. 中断处理结束。

以上是总述形式的 Cortex-A7 的中断处理,有一些细节没有提到,比如中断抢占,RTOS 下中断中的上下文切换等。

Cortex-R5 的中断处理流程,总述如下:

  1. 软件维护一个中断服务函数及其参数的结构体数组,每一个数组元素(结构体)对应一个中断向量。

  2. VIM 寄存器初始化,清除各中断状态,初始化中断优先级,中断映射类型(IRQ/FIQ),中断触发内存,失能所有中断。

  3. 维护一个总的 irq_handler,以及维护一个中断服务函数及其参数的结构体数组。

  4. 注册某一个中断的中断服务函数及其参数,到结构体数组中,并将总的 irq_handler 写入 VIM 的向量地址寄存器中(即使此模式下我们不通过该寄存器来获取中断向量地址),并使能指定中断。

  5. 当中断触发后,pc 指针跳转到中断向量表中偏移量为 0x18 的地址处,再跳转到统一的 irq_handler。

  6. 在 irq_handler 中,读取 VIM_IRQVEC 寄存器,读取该寄存器后会设置活跃中断寄存器。
    在这里插入图片描述

  7. 读取活跃中断寄存器VIM_ACTIRQ,获取触发中断的向量号。
    在这里插入图片描述

  8. 使用获取的向量号,从软件维护的结构体数组中,调用自定义的中断服务函数。

  9. 根据中断触发类型,清除中断标志位:
    在这里插入图片描述

  10. VIM_IRQVEC 寄存器中写任意值,表示中断处理结束。
    在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《ARM架构参考手册armv7-a和armv7-r版.pdf》是一本关于ARM架构的参考手册。ARM架构是一种广泛应用于嵌入式系统和移动设备的处理架构。该手册分为armv7-a版和armv7-r版两个版本。 armv7-a版是面向应用处理器的版本,主要用于移动设备、平板电脑、智能电视等设备。它提供了丰富的功能和指令集,支持多处理和高性能计算,能够满足复杂应用的需求。该手册详细介绍了armv7-a架构的特点、寄存器、指令集以及内存管理等内容,为开发者提供了系统级的技术支持。 armv7-r版则是专门为实时应用处理器设计的版本,主要用于汽车电子、工业自动化、医疗设备等领域。相比于armv7-a版,它更注重实时性和可靠性,提供了面向实时应用的特殊指令集和硬件特性。该手册详细介绍了armv7-r架构的特点、寄存器、指令集以及实时性相关的特性,为开发者提供了针对实时应用的技术指导。 总之,该手册是ARM架构的权威参考资料,旨在帮助开发者理解和应用armv7-a和armv7-r架构,以提升系统性能和实时性。无论是开发应用还是实时系统,对ARM架构感兴趣的开发者都可以从该手册中获得详细的技术指导。 ### 回答2: 《ARM架构参考手册ARMv7-A和ARMv7-R Edition.pdf》是一本关于ARM架构的参考手册。ARM架构是一种广泛应用于嵌入式系统和移动设备的处理架构。 这本手册旨在提供有关ARMv7-A和ARMv7-R两个版本的详细信息。ARMv7-A是应用程序处理器的主要版本,而ARMv7-R是实时处理器版本。手册介绍了这两个版本的架构特性、指令集、寄存器和系统级特性。 手册的内容包括了ARMv7-A和ARMv7-R的各个模块的详细说明,如处理心、系统控制和调试接口等。此外,手册还讨论了架构的安全特性,包括访问权限和异常处理ARM架构的特点之一是其指令集的精简性和高效性,手册深入介绍了各种指令的功能和使用方法,以及指令的执行过程和相关的寄存器操作。 另外,手册还提供了有关如何开发软件和编写代码以实现ARMv7-A和ARMv7-R架构的最佳实践指南。这些指南涵盖了编程规范、编译器优化和调试技术等方面的建议,帮助开发人员更好地利用ARM架构的性能和功能。 总之,《ARM架构参考手册ARMv7-A和ARMv7-R Edition.pdf》是一本权威的参考资料,提供了关于ARMv7-A和ARMv7-R架构的详细信息,对于开发者和研究人员来说是一本宝贵的资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值