S5PV210的中断处理机制详解
1、ARM的中断机制介绍
参考博客:《ARM架构的中断机制详解(S5PV210芯片)》;
2、S5PV210芯片的中断处理过程
2.1、中断处理第一阶段
S5PV210芯片的中断处理第一阶段就是异常向量表的跳转,并没有任何特别,看上面的参考博客即可;
2.2、中断处理第二阶段
(1)找到发生的对应中断源:芯片支持不止一个中断,当发生中断时首先要区分出是哪个中断源发生了中断。S5PV210芯片有4个中断状态寄存器,寄存器的每个位表示一个中断的状态,通过读取中断状态寄存器的值就可以知道是哪个中断源发生中断。4个中断状态寄存器理论上支持128个中断,实际有的位是保留的,实际支持不足128个中断源;
(2)调用对应的中断处理程序。在中断的初始化阶段,会为每个中断都绑定中断处理程序,当发生中断后硬件会自动将对应中断的处理程序推送到VICnADDR寄存器中,我们只需要读取,省去了查找的过程;
补充:S5PV210芯片在硬件上设计了中断编号和中断处理程序的查找过程,降低软件程序员的编程难度,并且提高了中断的响应速度,具体中断查找过程请看下面寄存器的介绍;
3、中断处理的流程
3.1、初始化阶段
(1)绑定总的中断处理程序(IRQ_hander)到异常向量表;
(2)初始化中断控制器:包括禁止中断、设置中断优先级、设置中断的模式;
(2)给每个中断源绑定特定的中断处理程序(irq_hander);
(3)使能对应中断;
3.2、处理中断阶段
(1)当中断发生时,首先跳转到异常向量表执行总的中断处理程序(IRQ_hander);
(2)保护中断现场;
(3)区分出是哪个中断源发生了中断,也就是得到中断号;
(4)调用初始化阶段为每个中断源绑定的特定的中断处理程序;
(5)恢复现场;
4、S5PV210芯片中断体系
4.1、向量中断控制器:VIC
表项 | 含义 |
---|---|
Module | 中断源属于的模块 |
VIC port no | 中断源在对应VIC的端口号 |
No | 中断源在整个中断系统中的编号 |
INT Request | 中断请求的类型,也就是这个中断是什么作用 |
(1)VIC(Vectored Interrupt Controller)控制器有4个,VIC0~VIC3;
(2)控制器的每个位代表一个中断源,理论上S5PV210芯片最多支持128个中断源,实际只支持93个中断源,有些位是空的;
(3)4个VIC控制器的中断编号是连续的,比如:VIC0的中断编号是0-31,以此类推,VIC3的中断编号是96-127;
(4)数据手册中有对4个VIC控制器每个位的说明,详情看上面的图和表格;
4.2、中断使能寄存器:VICINTENABLE
(1)寄存器功能:使能中断;
(2)中断使能寄存器有4个,刚好对应4个VIC,寄存器的每个位对应一个中断源;
(3)读寄存器:0代表中断被禁止,1代表中断已经使能;
(4)写寄存器:写0没有任何作用,写1表示使能中断;
补充:寄存器的命名是有规律的,比如:VICINTENABLE寄存器,VIC代表寄存器属于向量中断控制器,INT是中断的英文(interrupt)缩写,ENABLE的英文意思就是允许的意思;
4.3、中断禁止寄存器:VICnINTENCLEAR
(1)中断禁止寄存器和中断使能寄存器是相对应的,一个负责禁止中断一个负责使能中断;
(2)需要注意中断禁止寄存器是只写的;
(3)中断禁止和使能有两种设计思路:一种是S5PV210这种将禁止和使能分别用两个寄存器去负责;另一种是将禁止和使能用同一个bit位去负责,比如写1表示禁止,写0表示使能;
4.4、中断模式选择寄存器:VICnINTSELECT
(1)中断分为普通中断(IRQ)和快速中断(FIQ),快速中断的响应速度更快,这是在硬件上就有保证;
(2)一般同时只把一个中断设置成FIQ;
(3)快速中断响应更快的原因,参考博客;《ARM中FIQ(快速中断)比IRQ(普通中断)响应快的原因》;
4.5、中断状态寄存器:VICIRQSTATUS和VICFIQSTATUS
(1)中断状态寄存器是只读的,每个位对应一个中断源的状态,读出来是0表示对应中断源未触发,读出来是1表示中断源触发;
(2)IRQ模式和FIQ模式各有4个中断状态寄存器,对应于前面介绍的4个VIC;
4.6、中断优先级设置寄存器:VIC[0-3]VECTPRIORITY[0-31]
(1)每个中断源都对应一个优先级设置寄存器,所以优先级寄存器总共有128个,每个VIC对应32个;
(2)优先级寄存器只有低4位有效,优先级总共分为16个优先级,默认将优先级设置成15;
4.7、中断处理程序绑定寄存器:VIC[0-3]VECTADDR[0-31]
(1)VICVECTADDR寄存器总共有128个,每个中断源对应一个;
(2)在中断的初始化阶段,将每个中断源的处理程序地址写到VICVECTADDR寄存器,当中断发生时就会自动跳转去执行对应的中断处理函数;
4.8、保存当前发生中断的处理程序的寄存器:VIC[0-3]ADDRESS
(1)VICADDRESS寄存器总共有4个,每个寄存器对应32个中断源,比如VICADDRESS0对应0-31编号的中断源,VICADDRESS1对应32-63编号的中断源;
(2)我们知道最多支持128个中断源,将其分为4组,每组32个中断源;
(3)当中断发生时,硬件会自动将发生中断的中断处理程序的地址写到VICADDRESS寄存器中,我们只需要读取即可;
(4)假设我们通过读取中断状态寄存器,知道中断编号为16的中断源发生了中断,编号16是属于VIC0的,中断处理程序地址保存在VIC0VECTADDR16寄存器中,硬件会自动将VIC0VECTADDR16寄存器的值写到VIC0ADDRESS寄存器中;
5、S5PV210芯片具体的中断处理流程
(1)在异常向量表中绑定总的中断处理程序;
(2)初始化中断控制器,通过读写相关寄存器,设置中断的优先级、模式、禁止/使能;
(3)绑定每个中断的处理程序:每个中断都对应一个中断处理程序绑定寄存器;
(3)发生中断时,依次读取4个中断状态寄存器,判断是哪个中断状态寄存器发生中断;
(4)根据发生中断的中断状态寄存器,从对应的VICADDRESS寄存器中读取到中断处理程序的地址,执行中断处理程序;
6、外部中断
参考博客:《ARM架构的外部中断介绍(S5PV210芯片)》;
S5PV210的中断处理机制详解相关推荐
- STM32 USB设备远程唤醒机制详解
目录 1.USB Resume信号 2.USB远程唤醒的方式 3.J状态和K状态 4.STM32 USB设备远程唤醒机制详解 5.主机对设备远程唤醒功能状态的获取.清除和设置 1.USB Resume ...
- PHP autoload机制详解
PHP autoload机制详解 转载自 jeakccc PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个 ...
- 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配
先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...
- Java类加载机制详解【java面试题】
Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...
- Numpy的广播机制详解(broadcasting)
Numpy的广播机制详解(broadcasting) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数 ...
- Session机制详解及分布式中Session共享解决方案
Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...
- java异常处理机制详解
java异常处理机制详解 参考文章: (1)java异常处理机制详解 (2)https://www.cnblogs.com/vaejava/articles/6668809.html 备忘一下.
- SpringMVC异常处理机制详解[附带源码分析]
SpringMVC异常处理机制详解[附带源码分析] 参考文章: (1)SpringMVC异常处理机制详解[附带源码分析] (2)https://www.cnblogs.com/fangjian0423 ...
- 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
2019独角兽企业重金招聘Python工程师标准>>> 在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码.当前有很多开源框架可以完成这些功能,如A ...
最新文章
- django报错is not a registered tag library. Must be one of
- 推荐的 CSS 书写顺序
- linux很多程序都要本地编译,让C/C++程序一次编译可以发布到多版本Linux之上
- [C++11]返回值类型后置
- python编码转换中文_python3如何中文转换编码?
- Aspx页面内 成员变量丢失的问题
- swagger python自动化用例_自动生成robot自动化测试用例
- 恩恩,庆祝一下,我也开博了。
- 一篇关于原生 js 开发一款插件的前端教程
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
- everything用于移动硬盘资料管理(一):离线搜索
- 用Python解读房贷利率,有没有套路?这是我见过最透彻的Python版解读!
- Excel透视表实操,只需6步就能搞定!
- android usb键盘监听,android设备外接键盘实现监听事件
- 喜迎B+轮融资,ThingJS母公司优锘科技成为新基建的一匹黑马
- Xiaocao's first blog post
- 配置nginx.conf证书,实现http跳转htpps(80-->443)
- nyoj 海岛争霸(Floyd最短路径)
- RK3228H开发之3328芯片手册简单分析
- 一文带你吃透微服务守门神SpringCloud-GateWay