coretex-A7 中的中断

一. 操作系统中中断

中断: 指处理机处理程序运行中出现的紧急事件的整个过程.程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。

二.   Coretex-A7的中断

1. 中断向量表

中断向量表即中断向量的列表。

中断向量表是一个表,这个表里面存放的是中断向量。
中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。
这些中断服务程序 ( 函数 ) 在中断向量表中的位置是由半导体厂商定好的,当某个中断被触发以后就会自动跳转到中断向量表中对应的中断服务程序 ( 函数 ) 入口地址处。中断向量表在整个程 序的最前面。

2. 中断向量偏移

我们说 ARM 处理器都是从地址 0X00000000 开始运行的,但是我们学习 STM32 的时候
代码是下载到 0X8000000 开始的存储区域中。因此中断向量表是存放到 0X8000000 地址处
的,而不是 0X00000000 ,这样不是就出错了吗?
为了解决这个问题, Cortex-M 架构引入了一 个新的概念——中断向量表偏移。
通过中断向量表偏移就可以将中断向量表存放到任意地址 处,中断向量表偏移配置在函数 SystemInit 中完成,通过向 SCB_VTOR 寄存器写入新的中断 向量表首地址即可。

3. GIC 中断控制器

GIC中断控制器即(Generic Interrupt Controller)

中断系统得有个管理机构,GIC中断控制器就是Cortex-A 内核的中断管理机构。

GIC用于管理 Cortex-A 的中断。GIC 提供了开关中断,设置中断优先级。

4.  Cortex-A7中断向量表

STM32 一样, Cortex-A7 也有中断向量表,中断向量表也是在代码的最前面。 Cortex
A7 内核有 8 个异常中断, 中断向量表如下
coretex-A7 中的中断_第1张图片

在表 17.1.2.1 中有个 IRQ 中断, Cortex-A 内核 CPU 的所有外部中 断都属于这个 IRQ 中断。
当任意一个外部中断发生的时候都会触发 IRQ 中断。在 IRQ 中断服 务函数里面就可以读取指定的寄存器来判断发生的具体是什么中断,进而根据具体的中断做出 相应的处理。
这些外部中断和 IRQ 中断的关系如下所示:
coretex-A7 中的中断_第2张图片

 左侧的 Software0_IRQn~PMU_IRQ2_IRQ 这些都是 I.MX6U 的中断,他们都属于 IRQ 中断。当图 17.1.2.1 左侧这些中断中任意一个发生的时候 IRQ 中断都会被触发,所以,我们需要在 IRQ 中断服务函数中判断究竟是左侧的哪个中断发生了,然后再做出具体的处理。

GIC 将众多的中断源分为分为三类:

(1)  SPI中断(Shared Peripheral Interrupt),即共享中断。

顾名思义,所有 Core 共享的中断,这个是最常见的,那些外部中断都属于 SPI 中断(注意!不是 SPI 总线那个中断) 。比如按键中断、串口 中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core

(2)  PPI(Private Peripheral Interrupt),私有中断。

我们说了 GIC 是支持多核的,每个核肯定有自己独有的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断。

(3)  SGI(Software-generated Interrupt),软件中断。

由软件触发引起的中断,通过向寄存器 GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信。

IMX6U中断号

IMX6ULL 支持 128 个中断。为了区分不同的中断,引入了中断号。

ID0~ID15 是给 SGI

ID16~ID31 是给 PPI

剩下的 ID32~1019 SPI(Shared Peripheral Interrupt),也就是按键中断、串口中断等等。

你可能感兴趣的:(linux)