07_I.MX6ULL_Cortex-A中断原理
目录
回顾STM32中断系统
中断向量表
NVIC(内嵌向量中断控制器)
中断使能
中断服务函数
Cortex-A7中断系统简介
GIC控制器简介
中断ID
中断服务函数的编写
回顾STM32中断系统
STM32的中断系统主要有以下几个关键点:
1.中断向量表。
2.NVIC(内嵌向量中断控制器)。
3.中断使能。
4.中断服务函数。
中断向量表
中断向量表是一个表,这个表里面存放的是中断向量。中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量,因此中断向量表是一系列中断服务程序入口地址组成的表。这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的,当某个中断被触发以后就会自动跳转到中断向量表中对应的中断服务程序(函数)入口地址处。中断向量表在整个程序的最前面,比如STM32F103的中断向量表如下所示:
ARM处理器都是从地址0X00000000开始运行的,但是我们学习STM32的时候代码是下载到0x8000000开始的存储区域中。因此中断向量表是存放到0X8000000地址处的,而不0x00000000,这样不是就出错了吗?为了解决这个问题, Cortex-M架构引入了一个新的概念中断向量表偏移,通过中断向量表偏移就可以将中断向量表存放到任意地址处,中断向量表偏移配置在函数Systemlnit中完成,通过向SCB_VTOR寄存器写入新的中断向量表首地址即可,代码加下所示:
NVIC(内嵌向量中断控制器)
中断系统得有个管理机构,对于STM32这种Cortex-M内核的单片机来说这个管理机构叫做NVIC,全称叫做Nested Vectored Interrupt Controller。关于NVIC本教程不作详细的讲解,既然Cortex-M内核有个中断系统的管理机构NVIC,那么I.MX6所使用的Cortex-A7内核是不是也有个中断系统管理机构?答案是肯定的,不过Cortex-A内核的中断管理机构不叫做NVIC,而是叫做GIC,全称是general interrupt controller,后面我们会详细的讲解Cortex-A内核的GIC。
中断使能
要使用某个外设的中断,肯定要先使能这个外设的中断,以STM32F103的PE2这个10为例,假如我们要使用PE2的输入中断肯定要使用如下代码来使能对应的中断:
上述代码就是使能PE2对应的EXTI2中断,同理,如果要使用I.MX6U的某个中断的话也需要使能其对应的中断。
中断服务函数
我们使用中断的目的就是为了使用中断服务函数,当中断发生以后中断服务函数就会被调用,我们要处理的工作就可以放到中断服务函数中去完成。同样以STM32F103的PE2为例,其中断服务函数如下所示:
当PE2引脚的中断触发以后就会调用其对应的中断处理函数EXTI2_IRQHandler,我们可以在函数EXTI2_IRQHandler中添加中断处理代码。同理, I.MX6U也有中断服务函数,当某个外设中断发生以后就会调用其对应的中断服务函数。
通过对STM32中断系统的回顾,我们知道了Cortex-M内核的中断处理过程,那么Cortex-A内核的中断处理过程是否是一样的,有什么异同呢?接下来我们带着这样的疑问来学习Cortex-A7内核的中断系统。
Cortex-A7中断系统简介
跟STM32一样,Cortex-A,也有中断向量表,中断向量表也是在代码的最前面。CortexA7内核有8个异常中断,这8个异常中断的中断向量表如表所示:
中断向量表里面都是中断服务函数的入口地址,因此一款芯片有什么中断都是可以从中断向量表看出来的。从表中可以看出,Cortex-A7一共有8个中断,而且还有一个中断向量未使用,实际只有7个中断。STM32F103中断向量表比起来少了很多!难道一个能跑Linux的芯片只有这7个中断?明显不可能的!那类似STM32中的EXTI9_5_IRQHandler、TIM2_IRQHandler这样的中断向量在哪里? I2C、SPI、定时器等等的中断怎么处理呢?这个就是 Cortex-A和 Cotex-M在中断向量表这一块的区别,对于Cortex-M内核来说,中断向量表列举出了一款芯片所有的中断向量,包括芯片外设的所有中断。对于Cortex-A内核来说并没有这么做,在表 中有个IRQ中断, Cortex-A 内核 CPU的所有外部中断都属于这个IRQ中断,当任意一个外部中断发生的时候都会触发IRQ中断。在IRQ中断服务函数里面就可以读取指定的寄存器来判断发生的具体是什么中断,进而根据具体的中断做出相应的处理。这些外部中断和IRQ中断的关系如图所示:
在图中,左侧的Software0_IRQn~PMU_IRQ2_IRQ这些都是I.MX6U的中断,他们都属于IRQ中断。当图左侧这些中断中任意一个发生的时候IRQ中断都会被触发,所以我们需要在IRQ中断服务函数中判断究竟是左侧的哪个中断发生了,然后再做出具体的处理。
在表中一共有7个中断,简单介绍一下这7个中断:
1.复位中断(Rest),CPU复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化SP指针、DDR等等。
2.未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。
3.软中断(Software Interrupt,SWI),由SWI指令引起的中断, Linux的系统调用会用SwI指令来引起软中断,通过软中断来陷入到内核空间。
4.指令预取中止中断(Prefetch Abort),预取指令的出错的时候会产生此中断。
5.数据访问中止中断(Data Abort),访问数据出错的时候会产生此中断。
6.IRQ 中断(IRQInterrupt),外部中断,前面已经说了,芯片内部的外设中断都会引起此中断的发生。
7.FIQ中断(FIQ Interrupt),快速中断,如果需要快速处理中断的话就可以使用此中断。
在上面的 7个中断中,我们常用的就是复位中断和IRQ中断,所以我们需要编写这两个中断的中断服务函数,根据表的内容来创建中断向量表,中断向量表处于程序最开始的地方,比如 start.S文件最前面,中断向量表如下:
GIC控制器简介
GIC是ARM公司给Cortex-A/R内核提供的一个中断控制器,类似Cortex-M内核中的NVIC。 目前GIC有4个版本:V1-V4, V1是最老的版本,已经被废弃了。V2~V4目前正在大量的使用。GIC V2是给ARMv7-A架构使用的,比如Cortex-A7、Cortex-A9、Cortex-A15等,V3和V4是给ARMv8-A/R架构使用的,也就是64位芯片使用的。I.MX6U是Cortex-A内核的,因此我们主要讲解GIC V2。GIC V2最多支持8个核。ARM会根据GIC版本的不同研发出不同的IP核,那些半导体厂商直接购买对应的IP核即可,比如ARM针对GICV2就开发出了GIC400这个中断控制器IP核。当GIC接收到外部中断信号以后就会报给ARM内核,但是ARM内核只提供了四个信号给GIC来汇报中断情况: VFIQ、VIRQ、FIQ和IRQ,它们之间的关系如图:
在图中, GIC接收众多的外部中断,然后对其进行处理,最终就只通过四个信号报给ARM内核,这四个信号的含义如下:
VFIQ:虚拟快速FIQ。
VIRQ:虚拟外部IRQ。
FIQ:快速中断IRQ。
IRQ:外部中断IRQ。
VFIQ和 VIRQ是针对虚拟化的,剩下的就是FIQ和IRQ了,以FIQ为例GIC最终向ARM 内核就上报一个IRQ信号。那么GIC 是如何完成这个工作的呢?GICV2的逻辑图如图所示:
图中左侧部分就是中断源,中间部分就是GIC控制器,最右侧就是中断控制器向处理器内核发送中断信息。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中断来完成多核之间的通信。
中断ID
中断源有很多,为了区分这些不同的中断源肯定要给他们分配一个唯一 ID,这些ID就是中断 ID。每一个CPU最多支持1020个中断ID,中断ID号为ID0-ID1019。这 1020个ID包含了PPI, SPI和SGI,那么这三类中断是如何分配这1020个中断ID的呢?这1020个ID分配如下:
ID0~ID15:这16个ID分配给SGI。
ID16-ID31:这16个ID分配给PPI。
ID32-ID1019:这988个ID分配给SPI,像GPIO中断、串口中断等这些外部中断,至于具体到某个ID对应哪个中断那就由半导体厂商根据实际情况去定义了。比如I.MX6U的总共使用了128个中断ID,加上前面属于PPI和SGI的32个ID, I.MX6U的中断源共有128+32=160个。
中断服务函数的编写
一个是IRQ中断服务函数的编写,另一个就是在IRQ中断服务函数里面去查找并运行的具体的外设中断服务函数。
07_I.MX6ULL_Cortex-A中断原理相关推荐
- 单片机定时器中断原理
单片机定时器中断原理 #define _1231_C_ #include "reg51.h" //sbit OE=P2^3; unsigned int SystemTime; vo ...
- ESP32 外部中断原理分析 GPIO外部中断实战
ESP32 外部中断原理分析 & GPIO外部中断实战 阅读建议: 有一定Cortex-m架构.Xtensa® 32-bit LX6 架构知识基础. 软件环境 VSCODE-ESP32-I ...
- 【转】ARM9 2410移植之ARM中断原理, 中断嵌套的误区,中断号的怎么来的
from:https://www.crifan.com/switch_arm9_2410_transplant_arm_interrupt_principle_the_error_interrupt_ ...
- pic16f1787 C语言程序,单片机定时器中断原理图解
描述 单片机定时器中断是我们经常都需要用的,下面将以51单片机为例子来说明单片机定时器中断原理. 80C51的定时/计数器的结构 定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组 ...
- STM32 中断原理及外部中断的实现
STM32 中断原理及外部中断的实现 NVIC 中断优先级管理 中断寄存器 库函数配置 小结 STM32 外部中断 基础知识 库函数配置 外部中断配置示例 小结 内容较充实,作为个人的学习记录 NVI ...
- 28.EXTI外部中断原理与配置
EXTI外部中断原理与配置 参考资料 开发板配套资料 <STM32Fx开发指南-HAL库版本>-第x章 外部中断实验 STM32Fxxx官方资料: <STM32Fxx中文参考手册&g ...
- 中断原理在计算机中的应用,计算机组成原理期末考试简答题重点
6.DMA方式和程序中断方式比较有什么不同? DMA:采用内在和外设直接数据交换的方式,只有当有一段数据传送时才会请求CPU中断,减少了CPU的负担. 程序中断:只适用于简单的少量外设的计算机系统,会 ...
- 中断原理在计算机中的应用,最新 计算机原理与应用 复习3-判断题
最新 计算机原理与应用 复习题目 1.INTR.INTA和NMI信号都是与中断有关的信号.( ) √ 2.8088在访问存储器时,必须用HOLD和HLDA两条信号线指示出总线是否可用.( ) 3.在8 ...
- 第九天:按键及中断原理
什么是按键? 按键的物理特性 一般的按键都有四个引脚,这四个引脚:其中一对是常开触点(不按则断,按下则合):一对是常闭触点(不按则 闭,按下则断) 按键的电学原理 硬件接法:SW5:GPH0_2 ...
最新文章
- flume的安装和部署
- 解决update-apt-xapi占用资源过高的问题
- CTO:再写if-else,逮着一个罚款1000!
- Zepto 与 jQuery 的区别 小结
- Spring Boot笔记-@Qualifier与@Autowired与@Bean
- python开发软件的实例-如何编写Python软件开发文档(7个技巧)
- 常见的SQL错误和解决方法
- 2017年最新(4月20日)手机号码归属地数据库分享
- dreamweaver html模版,解决dreamweaver制作模板网页的详细方法教程--系统之家
- SAP中销售项目开票的初步分析
- Java 序列化对象为json字符串,属性首字母大写,并按照属性首字母排序
- 美国商务签证面试经历
- HTTP中的301、302、303、307、308
- 鸟飞行html代码控制,html5 canvas一群鸟飞行
- 【论文阅读笔记】Explaining And Harnessing Adversarial Examples
- python编程语言零基础入门-零基础学习编程,Java、Python你会选择哪个?
- 超详细:前端 2019 学习路线(B站视频)
- 解决pycharm下载速度太慢的问题
- aptio设置全中文_MMtool Aptio
- Falcon(二)——架构详解
热门文章
- 随着云计算的发展,传统的数据中心逐渐转向虚拟化数据中心
- 湘潭大学女教授和校门口摆摊的丈夫,女教授:他都是为了我
- 2022/7/18-7/19
- Android自定义图形-Shape
- rewrite功能介绍
- html怎么用视频做网页背景图片,使用视频作为网页背景的技术探讨
- y.sing_【Y.SING衣香丽影(国商店)】Y.SING衣香丽影(国商店)电话,Y.SING衣香丽影(国商店)地址_图吧地图...
- Android三种常用菜单Menu(OptionMenu,ContextMenu,PopupMenu)的详细讲解使用(全网最详细)
- 025:求特殊自然数
- 名帖381 解缙 草书《自书诗》