如果要你讲一下中断,你会怎么去描述一个中断的触发流程呢?

最基础的可能就是:保护现场 - 中断处理 - 恢复现场...

那保护现场做了什么事情?中断处理需要注意什么事情?恢复现场又做了什么事情?

相对应的,关于中断,还有很多这样的问题:

  • 触发中断的因素有哪些?
  • 各中断源如何向CPU提出中断请求?

  • CPU如何区分是哪个中断触发的请求?

  • 当多个中断源同时提出中断请求时,中断系统如何确定优先响应哪个中断请求?

  • CPU在什么条件、什么时候、以什么方式来响应中断?

  • CPU响应中断后,如何保护现场?

  • CPU响应中断后,如何停止源程序的执行而转入中断服务程序的入口地址?

  • CPU响应中断结束后,如何恢复现场?如何返回到源程序的间断处?

  • 在中断处理的过程中又出现了新的中断请求,CPU该如何处理?

  • 设计中断系统时,需要考虑哪些主要问题?

    ...

本文希望就以上的问题,对中断触发和响应流程进行一个详细的描述。力求可以通过一篇文章将中断讲明白!


首先,我先简单的描述一个中断的触发流程:

  1. 我们通过某些操作(例如按下按键),产生了电信号(电平触发 / 边沿触发);

  2. 这些电平信号,通过硬件上的中断引脚,被传递到了中断控制器;

  3. 如果该中断没有被关闭/屏蔽,中断控制器会向CPU发送中断请求;

  4. CPU收到中断请求后,判断是否响应该中断;

  5. (保护现场)如果一切条件满足,响应中断,将当前正在运行的程序上下文保存到寄存器/堆栈中;

  6. (中断处理)CPU寻找中断服务程序的入口地址,跳转到中断服务程序运行;

  7. (恢复现场)中断处理结束后,CPU会将之前保存在堆栈中的断点和寄存器重新恢复;

  8. CPU继续运行之前被打断的程序。


在上述例子中,相关的问题如下:

  • 产生中断的方式有哪些?

答:主动触发、软件触发、硬件触发。

  1. 主动触发(程序中通过函数接口,通知CPU进行中断处理)
  2. 内部中断(数据溢出、非法地址访问、未识别的操作码...)
  3. 外部中断(输入/输出设备、硬件设备故障...)
  • CPU如何区分是哪个中断源触发的请求?

答:中断引脚+中断号。

每一个能够发出中断请求的硬件设备控制器都有一条名为“IRQ”的输出线。

所有的IRQ输出线都与一个名为可编程中断控制器的硬件电路输入引脚相连。

中断控制器会监视IRQ线上的信号。

如果IRQ线上出现信号,中断控制器会将其转化成对应的中断号,通知CPU处理。

CPU根据中断号,在中断向量表中找到对应的中断处理程序

...


外部设备进行I/O操作时,会随机产生中断请求信号。这个信号中会有特定的标志,使计算机能够判断是哪个设备提出中断请求,这个信号就叫做中断号。

中断号一般是由中断控制器提供的,中断控制器支持一系列的中断源,并提供对应的中断号。中断引脚也是由中断控制器上引出来的。

即中断控制器将中断引脚和中断号关联起来,CPU又将中断号和中断处理程序关联起来,

最终实现了通过中断引脚上的信号,触发CPU去执行中断处理程序。

  • 当多个中断源同时提出中断请求时,中断系统(中断控制器)如何确定优先响应哪个中断请求?

答:中断优先级+中断屏蔽

为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。

在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪一个中断源服务,以及服务的次序。

解决的方法是中断优先排队,即根据中断源请求的轻重缓急,排好中断处理的优先次序即优先级( Priority ),又称优先权,先响应优先级最高的中断请求。

另外,当CPU正在处理某一中断时,要能响应另一个优先级更高的中断请求,而屏蔽掉同级或较低级的中断请求,形成中断嵌套。

  • CPU在什么时候、什么条件、以什么方式来响应中断?

答:可以从产生中断、接收中断、执行中断角度去描述。

中断控制器对应的中断引脚上收到信号(产生中断),中断未被屏蔽、中断优先级最高(接收中断),CPU当前处于可以切换上下文的状态(执行中断)。

CPU响应中断条件:

  1. 有中断源发出的中断请求;
  2. 中断总允许位EA=1,即CPU开中断;
  3. 申请中断的中断源的中断允许位为1,即中断没有被屏蔽;
  4. 无同级或更高级中断正在被服务;
  5. 当前的指令周期已经结束。
  • (保护现场)CPU响应中断后,在开始执行中断服务程序之前,需要做哪些操作?如何保护现场?如何保存原程序断点?

答:简单来说就是,寄存器、堆栈、压栈。

保护现场就是当出现中断时,把CPU的状态,也就是当前程序地址保存在寄存器中,随后转向执行其他任务,当任务完成,从寄存器中取出地址继续执行。保护现场其实就是保存中断前一时刻的状态不被破坏。

CPU保护现场做如下动作:

  1. 将标志寄存器内容压入堆栈,以保护中断时的状态;
  2. 将IF和TF标志清0,目的是防止在中断响应的同时又来别的中断,而将TF清0是为了防止CPU以单步方式执行中断处理子程序。这时要特别提醒,因为CPU在中断响应时自动关闭了IF标志,因此用户如要进行中断嵌套时,必须在自己的中断处理子程序中用开中断指令来重新设置IF;
  3. 保护断点,断点指的是在响应中断时,主程序当前指令下面的一条指令的地址。因此保护断点的动作就是将当前的IP和CS的内容入栈,保护断点是为了以后正确地返回主程序;

Ps:保护现场应该包括保护程序断点和保护CPU内部各寄存器内容的现场俩个方面

Ps:主程序和中断服务子程序都要使用CPU内部寄存器等资源,为使中断处理程序不破坏主程序中寄存器的内容,应先将断点处各寄存器的内容压入堆栈保护起来,再进入的中断。

  • (执行中断)CPU响应中断后,如何转入中断服务程序运行?

答:中断向量表。

CPU响应中断做如下动作:

  1. 根据中断号(由中断控制器传递),在中断向量表中找出相应的中断服务程序的入口地址,跳转至中断服务子程序执行。

Ps:驱动在申请注册中断时,会将中断服务程序和中断号进行绑定。

Ps:中断号是由中断控制器提供的,中断控制器将对应的中断号和中断引脚进行绑定。

  • (恢复现象)CPU响应中断结束后,在开始执行中断服务程序之后,需要做哪些操作?如何恢复现场?如何返回到原程序的断点处?

答:简单来说就是,寄存器、堆栈、出栈。

恢复现场就是指将各寄存器和指针恢复到中断前的状态。

当中断处理完毕后,CPU将原程序保存在堆栈中的各个寄存器的内容弹出,即恢复原程序断点处寄存器的原值。

CPU保护现场做如下动作:

  1. 恢复断点,断点指的是在响应中断时,原程序当前指令下面的一条指令的地址。因此恢复断点的动作就是将先前的指针和寄存器的内容出栈,即恢复原程序断点处寄存器的原值;
  2. 将IF和TF标志置1,允许接收新的中断;

除此之外,中断很多的概念,例如:

什么是中断上下文?

什么是中断的顶半部、底半部?

中断程序的编写过程钟,有哪些注意事项?

可以参考我的其他文章:

Linux中断知识汇总:

【深入理解Linux内核】【中断】内容汇总帖

【中断】你对中断究竟有多了解?试着把中断的触发流程整理了一遍...相关推荐

  1. 中断系统的简单了解以及C51(STC89C52)单片机中断系统的详解

    目录 一.中断系统简介 二.C51单片机的中断 1.外部中断 2.定时器/计数器中断 三.总结 一.中断系统简介 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的. 当中央处理机CPU正在 ...

  2. hal库开启中断关中断_(2)STM32使用HAL库操作外部中断——理论讲解

    1.中断触发过程 对主程序压栈--把中断服务函数的地址写入到程序计数器(PC)--执行中断服务函数 2.中断向量表 中断服务函数的地址在STM32的手册上的中断向量表中(如下是一部分): 如上表所示, ...

  3. 子程序与中断程序的异同_【干货】plc怎样理解中断功能,其作用是什么?

    plc怎样理解中断功能: 在理解plc中断时,你首先要清楚plc的运算周期或者说是扫描周期.我们有必要说下plc顺控循环执行的流程,这是理解中断的前提,必须要掌握. 分为三部分:输入处理.程序处理.输 ...

  4. linux 内核中断与时钟的冲突 问题 del_timer,Linux内核开发之中断与时钟(三)

    晚上7点10分.. "小涛哥,这章不是叫Linux设备驱动程序之中断与时钟,前边你讲了中断,还给了我很多模版,我都看懂了,这次是不是要开始讲时钟了.." "真聪明,越来越 ...

  5. 外部中断器1C语言程序,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 * 名称:外部中断 * 日期:2013-9-10 * 晶振:11.0592MHZ ************************************ ...

  6. 全局中断_实时性迷思(3)——80%时间屏蔽了中断,实时性还有救么?

    [写在前面的话] 在本系列的第一篇文章<实时性迷思(1)--快是优点么?>中,我们介绍了实时性的基本模型: 并得出两个重要的结论: 实时性只关注"是否能在实时性窗口内完成对应事件 ...

  7. stm32cubeide外部中断_【STM32】HAL库 STM32CubeMX教程三----外部中断(HAL库GPIO讲解)

    前言 上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了 今天我们会详细的带你学习STM32CubeMX配置外部中断,并且 ...

  8. 中断按键c语言程序设计,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 * 名称:外部中断 * 日期:2013-9-10 * 晶振:11.0592MHZ ************************************ ...

  9. 中断触发流程三(中断控制器)

    这一篇主要说说中断控制器,及GPIO中断触发与中断号的识别,为什么GPIO引脚的触发最后调用特定的中断例程,这中间是怎么联系起来的.现在知道的是request_irq只是在特定的中断号 链表中注册了一 ...

最新文章

  1. 企业级区块链现状研究报告:小企业的投资总额是大企业的28倍
  2. 有关Location对象,及URL的解析
  3. Android 高级Drawable资源---复合Drawable----变换Drawable
  4. 论文浅尝 | 基于平行新闻的Bootstrapping关系抽取
  5. 程序猿怎样的生活方式才能兼顾工作、家庭和自我提升
  6. 发红包的测试用例设计点
  7. eclipse java 源代码,java – 下载Eclipse源代码
  8. Python实现样本类别的可视化(绘制饼图,展示各类别样本的比例)
  9. VB6 GDI+ 入门教程[7] Graphics 其他内容
  10. Python基础--03
  11. 负载均衡的几种方式_负载均衡的几种类型
  12. 大学计算机基础应用教程ppt,大学计算机基础教程.ppt
  13. 数据治理(五):元数据管理
  14. 哈夫曼树的构造和哈夫曼编码实现详细讲解(含例题详细讲解)
  15. 互联网日报 | 中国移动香港实现5G独立组网;嫦娥五号顺利进入环月轨道;钟慧娟成全球白手起家女首富...
  16. 在.cpp文件中调用.c文件中的函数
  17. 如何用python进行回归分析_如何用python进行回归分析
  18. robo3T-操作MongoDB数据库常用命令
  19. 【笔记】玩转CSS3新特性_from_JSPang
  20. J3455基于OMV组建NAS

热门文章

  1. 为什么eclipse运行显示没有在main方法
  2. .xsd转Java Bean及生成的.java文件编码格式调整
  3. ubuntu16.04默认python3.5使用pip下载外置模块出现问题的解决方法
  4. 我对颈椎问题之研究与实践
  5. 前端性能优化方法与实战12 理论分析:Hybrid 下的性能优化整体分析
  6. iBox平台唯一交易服务商易宝支付发声:从未限制用户提现
  7. python画散点图和折线图
  8. IMU(陀螺仪、加速度计)Magnetometer(磁力计)校准方法和流程
  9. 中兴软创笔试前的一些准备
  10. java实现频繁项集_java实现Apriori算法——频繁项集的计算