查缺补漏----I/O中断处理过程

中断优先级包括响应优先级和处理优先级,响应优先级由硬件线路或查询程序的查询顺序决定,不可动态改变。处理优先级可利用中断屏蔽技术动态调整,以实现多重中断。下面来看他们如何运用在中断处理过程中:

中断控制器位于CPU和外设之间,用于处理I/O中断请求。以下是一个简化的中断控制器:

现在有A,B,C三个中断源。中断响应优先级:A>B>C,中断处理优先级:C>B>A

根据图来看,CPU响应中断应该具备3个条件:

① 在 CPU 内部设置的中断屏蔽寄存器(触发器)必须是开放的。

② 外设有中断请求时,中断请求寄存器(触发器)必须处于“1”状态,保持中断请求信号。

③ 外设(接口)中断允许触发器必须为“1”,这样才能把外设中断请求送至 CPU。

具备上述三个条件时,CPU 在现行指令结束的最后一个状态周期响应中断。

假设CPU正在处理A中断源的中断请求,此时B,C同时发出了中断请求,CPU执行完当前指令后,会检查INTR(中断请求信号寄存器)是否有效(INTR高电平有效)。

怎么看INTR是否有效,那就要看屏蔽寄存器是否会将信号屏蔽,由于中断处理优先级C>B>A,所以屏蔽寄存器不会屏蔽中断信号,INTR会接收到中断请求,变为有效。

CPU是否能检测到中断请求信号有效,是由中断处理优先级决定的,而不是中断响应优先级。

由于现在B,C的处理优先级都大于A,所以都要被送到判优电路当有多个中断源的中断请求到达判优电路时,就由中断响应优先级来决定CPU应该响应哪一个。响应优先级B>C,所以向量地址形成线路会形成中断源B的中断类型号(也就是下图的送中断向量的过程)。

CPU响应B中断源的中断请求,执行B的中断服务程序,程序会设置新的中断屏蔽字(每个中断源对应一个屏蔽字,其中1越多,优先级越高),并且保存现场,并且开中断。

由于C的中断请求还没有被处理,并且处理优先级C>B,所以B的中断服务程序又会响应C中断源发来的中断请求。当C的中断服务程序执行完后,返回到B,B的服务程序再返回到A。所以,完成顺序C>B>A,响应顺序B>C。

总结(非常重要):

中断优先级包括响应优先级和处理优先级,中断屏蔽标志改变的是处理优先级。中断响应优先级是由中断查询程序或中断判优电路决定的,它反映的是多个中断同时请求时哪个先被响应即中断服务程序开始执行的顺序。在多重中断系统中,中断处理优先级决定了本中断是否能打断正在执行的中断服务程序,决定了多个中断服务程序执行完的次序

注:

中断类型号是通过数据线传给CPU的,一定要记得地址线是单向的(地址只能从 CPU 传向外部存储器或 I/O 端口)。中断类型号用于指出中断向量的地址,CPU响应某个外部中断后,就从数据总线上获取该中断源的中断类型号,然后据此计算对应中断向量的地址,再根据该地址从中断向量表中取出中断服务程序入口地址,即中断向量。

② 只有每条指令执行的最后一个操作控制信号CPU才会检测INTR是否有中断请求信号CPU采样到INT信号有效,则进入中断响应周期。

③ CPU检测到信号有效,进入中断响应周期,隔一段固定的时间就会发出中断查询信号,也就是在中断响应过程中,发出中断查询信号(中断回答信号)。由这个信号,所有未被屏蔽的信号就会进入判优电路,由判优线路决定是否响应。

到这里就可以更清楚地理解中断响应的条件:

① CPU处于开中断状态        ② 一条指令执行完        ③ 至少要有一个未被屏蔽的中断请求

中断响应的时间点和异常处理的时间点是不一样的,中断一定是在一条指令执行结束后开始查询有无中断请求,有的话立即响应,所以一定是在指令执行完时响应中断,而异常发生在指令执行过程中,异常的处理是在指令执行中进行的。

中断处理的过程:

中断响应:

中断响应是硬件完成的,也就是从总线上取中断地址,CPU会做三件事:

① 关中断;② 保护断点和程序状态;③ 识别中断源:取得中断服务程序的首地址和初始PSW送PC和PSWR

执行中断服务:

(1)准备阶段:

① 保护现场(比如一些通用寄存器的内容)及旧屏蔽字(比如B打断A的中断服务程序后,要保存A的中断屏蔽字,以便中断返回时恢复旧的屏蔽字)

② 查明原因(软件识别中断时才会用到)

③ 设置新屏蔽字 ④ 开中断

注:对于保存屏蔽字,设置新的屏蔽字以及开中断,都是针对多级中断的,因为可能会有多个中断请求,所以需要设置屏蔽字和开中断。

(2)进行具体的中断处理

(3)恢复阶段:
① 关中断 ② 恢复现场及旧屏蔽字 ③ 清除中断标志(清除该中断源的中断请求,否则CPU又检测到中断,又会反复进入中断)④ 开中断 ⑤ 中断返回

注:这里为什么又要开中断了呢?这个开中断是对应中断响应的关中断的,如果这里不开中断就没有办法响应新的中断请求了。

所以:

对于单级中断:

中断响应:

① 关中断        ② 保存断点和程序状态        ③ 寻找中断程序入口地址

中断服务:

① 保存现场        ② 处理中断事件       ③ 恢复现场        ④ 开中断        ⑤ 中断返回

对于多级中断:

中断响应:

① 关中断        ② 保存断点和程序状态        ③ 寻找中断程序入口地址

中断服务:

① 保存现场和屏蔽字        ②开中断        ③ 处理中断事件       ④ 关中断        ③ 恢复现场和屏蔽字        ④ 开中断        ⑤ 中断返回

(1)1号中断源:11111 2号:01100 3号:00100 4号:01111 5号: 01101

① 先响应2的中断请求,即保存现场,保存中断屏蔽字,设置新的中断屏蔽字,开中断。一旦开中断,就会立马响应4,因为4的中断处理优先级大于2。

② 处理完4的中断服务程序后,会回到2继续执行其中断服务程序。

③ 中断处理优先级1>5>2>3,所以当1,3,5同时发出中断请求,2能屏蔽3。

④ 中断响应优先级1>5,所以先执行1,并且1的中断处理优先级也是最高的,所以1不会被5打断。(如果这里1的中断处理优先级小于5,则1中断服务程序执行过程中会响应5的中断请求)

⑤ 1处理完后,返回2,由于5的中断处理优先级大于2,所以5会被响应。

⑥ 由于2的处理优先级大于3,所以3号中断源被2号屏蔽,只有当2号执行完后,并且返回用户程序(因为2号的中断屏蔽字决定了2号是检测不到3号的中断请求的),再执行3号中断请求

例题:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划最长上升子序列问题讲解和【题解】——最长上升子序列

动态规划最长上升子序列讲解和题解——最长上升子序列 最长上升子序列问题讲解1.概念解析2.举例了解3.示例程序 最长上升子序列题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示思路解析 最长上升子序列问题讲解 1.概念解析 最长上升子序列 ( L o n g e s…

微服务sentinel解析部署使用全流程

sentinel源码地址: 介绍 alibaba/Sentinel Wiki GitHub sentinel官方文档: https://sentinelguard.io/zh-cn/docs/introduction.html Sprong Cloud alibaba Sentinel文档【小例子】 : Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 目录 1、…

C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布

一:让 SQLiteExpert 支持(cipher)加密数据库 SQLiteExpert 作为SQlite 的管理工具,默认不支持加密数据库的,使其成为支持(cipher)加密数据库的管理工具,需要添加e_sqlcipher.dll &…

Android-Handle消息传递和线程通信

本文为作者学习笔记,如有误,请各位大佬指点 目录 一、同步异步 二、Java多线程通信 三、Handler是什么 四、Handler相关的类 五、Handler常用方法 1. 发送消息 2. 接收处理消息 3. 切换线程 六、使用Handler 使用Handler更新UI 使用Handler延…

蓝桥杯【物联网】零基础到国奖之路:十八. 扩展模块之光敏和AS312

蓝桥杯【物联网】零基础到国奖之路:十八.扩展模块之光敏和AS312 第一节 硬件解读第二节 CubeMX配置第二节 代码 第一节 硬件解读 光敏和AS312如下图: 光敏电阻接到了扩展模块的5号引脚,5号引脚接了2个电阻,R8和光敏电阻。我们通过ADC读取这…

Python 从入门到实战33(使用MySQL)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…

ASP.NET Zero 多租户介绍

ASP.NET Zero 是一个基于 ASP.NET Core 的应用程序框架,它提供了多租户支持,以下是关于 ASP.NET Zero 多租户的介绍: 一、多租户概念 多租户是一种软件架构模式,允许多个客户(租户)共享同一套软件应用程序…

探索TOGAF理论的实践应用:企业数字化转型的深度指南

数字化转型的迫切性与路径选择 随着全球化进程和技术革命的加速,企业正面临前所未有的挑战和机遇。数字化转型已成为企业保持竞争力、创新业务模式、优化客户体验的核心手段。然而,企业在实施数字化转型时,往往面临路径不清、技术与业务脱节…

《Linux从小白到高手》理论篇(七):Linux的时间管理运行级别启动过程原理详解

List item 本篇将介绍Linux的时间管理&运行级别相关知识,并将深入介绍Linux的启动过程及原理。 Linux的时间管理 Linux 时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称 RTC)时钟。系统时…

Linux驱动开发(速记版)--设备树插件

第六十八章 设备树插件介绍 Linux 4.4之后引入了动态设备树,其中的设备树插件(Device Tree Overlay)是一种扩展机制,允许在运行时动态添加、修改或删除设备节点和属性。 设备树插件机制通过DTS(设备树源文件&#xff0…

protobuf 讲解

一、序列化概念回顾 二、什么是PB 将结构化数据进行序列化的一种方式 三、PB的特点 语言无关、平台无关:即PB支持Java,C、Python等多种语言。支持多个平台 高效:即比XML更小,更快,更为简单。 扩展性、兼容性好&am…

WPF之UI进阶--控件样式与样式模板及词典

WPF的优势之一就是能够更加容易快捷的对窗体和控件的外面进行改造,换句话说,那就是UI设计个性化更加容易。主要是借助了样式、模板及词典来实现的。那么本篇博文就一一对他们进行介绍。 文章目录 一、样式1: 定义样式2: 使用Setter设置属性关于Property和…

C或C++判断指针是否指向同一块内存

有时需要判断指针是否指同一块内存,例如设计字符串时: (1)insert函数 (2) replace函数 (3)assign函数 难点是迭代器,判断是否同一个迭代器时,需要你在设计迭代器时加…

Kubernetes-环境篇-01-mac开发环境搭建

1、brew安装 参考知乎文章:https://zhuanlan.zhihu.com/p/111014448 苹果电脑 常规安装脚本(推荐 完全体 几分钟安装完成) /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"苹果电脑 极…

Rstudio:强大的R语言集成开发环境(IDE)

Rstudio 应该是 R 语言使用的标配,尽管 Rstudio 的母公司 Posit 推出了新一代的集成开发环境 Positron,但其还处于开发阶段。作为用户不妨让其成熟后再使用,现阶段还是 Rstudio 更稳定。 如果你在生物信息学或统计学领域工作,R语言…

Python | Leetcode Python题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m, n len(g), len(s)i j count 0while i < m and j < n:while j < n and g[i] > s[j]:j 1if j < n:count 1i …

uni-app - - - - -vue3使用i18n配置国际化语言

uni-app - - - - -使用i18n配置国际化语言 1. 安装vue-i18n2. 配置文件2.1 创建如下文件2.2 文件配置2.3 main文件导入i18n 3. 页面内使用3.1 template内直接使用3.2 变量接收使用 1. 安装vue-i18n npm install vue-i18n --save2. 配置文件 2.1 创建如下文件 locales文件夹里…

水泵模块(5V STM32)

目录 一、介绍 二、传感器原理 1.尺寸介绍 2.继电器控制水泵电路原理图 三、程序设计 main.c文件 bump.h文件 bump.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 水泵模块(bump)通常是指用于液体输送系统的组件&#xff0c;它负责将水或其他流体从低处提…

四.网络层(上)

目录 4.1网络层功能概述 4.2 SDN基本概念 4.3 路由算法与路由协议 4.3.1什么是路由协议&#xff1f; 4.3.2什么是路由算法&#xff1f; 4.3.3路由算法分类 (1)静态路由算法 (2)动态路由算法 ①全局性 OSPF协议与链路状态算法 ②分散性 RIP协议与距离向量算法 4.3.…

【C语言】内存函数的使用和模拟实现

文章目录 一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset的使用四、memcmp的使用 一、memcpy的使用和模拟实现 在之前我们学习了使用和模拟实现strncpy函数&#xff0c;它是一个字符串函数&#xff0c;用来按照给定的字节个数来拷贝字符串&#xff0c;那么问…