学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

上一篇文章我们学习了微处理器与微控制器的区别。点击链接查看上一篇文章的内容:微处理器与微控制器

本篇文章我们学习中断的概念与意义。本片文章只学习中断概念与意义,并不深入研究中断向量表与ISR中断服务程序的实现。同时本片文章讲解一个与中断有关的应用:断点调试。当然具体的断点调试方法会在后面讲解,本次只是说明中断在断点调试中的应用。

1、中断的概念与意义

1.2、 中断的概念

  • 中断是一种处理器与外设进行通信的机制(在我们学习了信号机制,会发现不一定是与外设之间)
  • 外设通过产生中断,向处理器告知,外部有重要事件发生
  • 处理器收到中断后,需要响应中断(具体如何响应见后面内容)

上面只是中断的简单概念。举个例子,我们点击鼠标的时候,鼠标这个外设会产生一个中断,当CPU收到这个中断的时候,CPU会响应这个中断,进而执行ISR(中断服务程序),在中断服务程序中肯定会调用鼠标的驱动模块,从而在电脑上我们才能看到鼠标的点击效果。

那么什么是中断服务程序呢(ISR)?

  1. 首先中断服务程序会从外设中读取外设的中断寄存器,从而获得中断的类型
  2. 然后根据中断类型,设计具体的处理逻辑(后面的学习中我们会发现实际上是通过中断向量表来选取具体的处理逻辑)
  3. 中断处理完毕后,还需要清除外设中的中断寄存器内容
  4. 然后清除CPU中的中断标识位
  5. 最后还需要恢复CPU中本该执行的指令

下面看一个图示来表示一个中断产生的过程:

  • 步骤一外设产生中断
  • 步骤二要先把当前正在执行的程序的上下文保存(比如通用寄存器的值)
  • 步骤三四读取外设中断寄存器的值,获得中断类型
  • 步骤五执行相应的中断处理程序
  • 步骤六清除外设的中断寄存器的值
  • 步骤七清除CPU的中断标识位
  • 步骤八恢复当前需要执行程序的上下文环境

那么,从程序的角度来考虑,中断服务程序(ISR)有哪些特征呢?

我们知道,中断服务程序执行完之后,需要再次回到之前的程序继续执行,所以ISR不能有返回值(想一想你有返回值得到话,谁来接收这个返回值呢?),并且,没有参数传递!因为前期已经通断中断向量表来选取了特定类型的处理逻辑,此处无需再让中断的类型当做参数传递来决定如何设计处理逻辑,所以无需参数。同时,对于这种打断程序运行的,比如后面的信号,程序最好不要太长,容易产生错误。所以ISR最好短小精悍,为了能够快速结束,最好少做浮点运算。

  • 不能有返回值,不能有参数传递
  • 尽量短小高效,避免浮点运算

1.2、中断的意义

  • 应用程序不必关心中断的处理与发生
  • 中断服务程序也不用关心应用程序的状态
  • 中断是上层应用与底层代码的分界线

1.3、中断的类型

  • 硬中断

    • 通过处理器的中断信号线产生的中断(鼠标按一下产生的中断,通过中断信号线发送给处理器)
  • 软中断

    • 通过非法指令或者特殊指令陷入的中断(比如系统调用也是一种软中断,它就是通过特殊指令Int 0x80陷入内核,也可以看做一种中断。再比如后面会学习的信号,也是一种中断)

1.4、中断的优先级

比如此时有好几个中断信号产生,比如你的电脑正在运行微博程序,你点击鼠标,立马有反应,这说明什么?说明鼠标的优先级比微博程序的优先级高。其实,任何ISR的优先级,都比应用程序的优先级高。而中断中,也分为不同的优先级,高优先级的中断会优先得到CPU的处理,且一个中断ISR在运行时,如果再来一个比它优先级高的中断,这个高优先级的中断会打断那个正在执行的中断程序。

  • 中断优先级

    1. 多个中断同时出现时,处理器优先响应高优先级的中断
    2. 低优先级中断的ISR执行时,可以被高优先级的中断再次打断
    3. ISR比上层应用程序的优先级都高

2、中断的应用-断点调试

2.2、什么是程序的断点?

大家都知道断点调试。程序的断点,其实就是一个指令的地址。这个指令的地址,是调试工具(例如GDB)让代码停止执行时候的位置。当你设置断点后,程序会在你设置的断点处停止执行。然后去执行你的调试工具里面的相应程序,那么接下来你就可以使用调试工具来获取程序的相应信息,比如上下文环境,栈信息等

2.2、 程序断点的实现原理

程序断点的实现原理,依赖于CPU的中断机制。包括CPU的硬中断机制与软中断机制。

说的通俗一点,就是将断点处的指令替换为中断触发指令,不再继续执行当前程序,而是去执行中断服务程序ISR,然后ISR再将CPU控制权交给你的调试工具的处理程序。

  • 程序断点的实现原理

    1. 获取源程序指定行对应的代码地址(指令地址)
    2. 保存当前程序的上下文环境信息
    3. 把该指令地址处的指令,替换为中断触发指令
    4. 在中断服务程序ISR中将CPU控制权交给调试工具的处理程序
    5. 调试程序开始做相应处理(比如可以读取源程序的上下文信息或者栈信息)
    6. 调试程序处理完后,将之前指令地址处的指令还原
    7. 恢复之前程序的上下文信息
    8. 源程序继续从断点处执行程序

下面来看一张图理解断点的实现原理

其中中断触发指令,被CPU执行后,OS会向调试程序发送signal,signal后面会讲。调试程序收到signal,会执行响应的处理函数handle。

以上只是大致讲原理,没有深入研究源码。

3、总结

本篇文章要学会:

  • 中断的概念与意义
  • 中断的类型(硬中断与软中断)
  • 中断的应用-断点与断点的实现原理

本系列文章几乎全部参考狄泰软件学院相关课程,想学习的可以加群,
群聊号码:199546072

学习探讨加个人:
qq:1126137994
微信:liu1126137994