最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

中断

工作和技术 crifan 1755浏览 0评论

中断

1.1 中断的起源
在中断之前,是轮询(polling)机制
CPU不用干别的事情了,就一直去查询设备有没有把活干完,
一直查啊查,等了半天,终于设备把事情做完了(其中有对应的寄存器状态可以表明是否完成任务)

这样CPU就将大量的精力浪费在无用的查询上,所以,引出了中断。

简单形容就是,
CPU把要做的事情高速外部设备后,就回头自己做自己其他的事情了,
然后等外设把要做的事情做完后,通过发一个中断信号给CPU,意思是我搞定了,
然后CPU就去执行对应的中断处理函数/中断服务程序(以下简写成ISR)去做一些必须的事情,
比如读取一些信息供后期使用。

这样,CPU的利用率就比以前大多了。
当然,麻烦的一点就是,之前要有中断的准备工作:
包括注册中断,即,外设说我有这样一个中断要到你这里报道,
其中要有对应的ISR,即 中断处理函数,就是到时候我外设发生了这么个中断后,
你CPU检测到后,就要去执行这个程序,做一些必要的处理,读取保存一些必要的信息之类的事情。

1.2 中断向量表的起源
如果实际环境中只有一个外设,该外设只有一个中断,当然对应的也就只有一个中断处理函数了,
那么就不需要中断向量表了,因为只要一发生中断,CPU不要去判断到底是哪个外设发出的中断,
直接去执行要执行的ISR就行了。
但是,实际环境中,往往多个外设,比如鼠标,键盘,显示屏等等,这时候一旦CPU收到一个中断,
就无法搞清楚到底是谁发的,也就没法去执行对应的函数,
这时候就采用中断向量表,用一个数组存储不同中断所对应的中断向量(也就是偏移位置)和对应要执行哪个ISR,
比如时钟Timer对应的是1号中断,USB对应14号中断之类的,然后当中断发生了,
去检测到底哪位为1,表明哪个设备发生了中断,然后就去调用对应的ISR。

1.3 软中断(Software Interrupt)和硬中断(Hardware Interrupt)的区别

一般说到的中断,即是硬中断,硬件中断。

硬件中断一般是一个独立的硬件系统,包含多条控制线,比如7条,22条,
每一个控制线和一个外设的中断输出连接,比如 14号控制线连接到USB,15号连接到IDE。
哪个线发生了中断,就知道是哪个设备产生的。
可见,硬件中断来自于CPU外部。

软件中断,来自于CPU内部。CPU有一堆可以运行的指令,整体上叫做指令集,其中有个特殊的指令,就是中断指令。ARM中是SWI。
CPU通过执行该特殊的指令产生软件中断。
(注:CPU的最本质的功能就是执行一条条指令)
只不过这个指令比一般指令特殊一些而已。
软件中断只要用来实现系统调用(System call)。

硬件中断会使得CPU通过上下文切换(Content Switch)去保存其当前状态,然后去
执行中断处理函数,即,CPU的值变成ISR的地址然后继续执行即可。
软件中断导致的上下文切换的行为,和硬件中断类似。

1.4 什么是 上下文切换(Content Switch)
所以的上下文切换,最简单的解释就是,
将当前用到的所有的普通寄存器,比如r0,r1之类的,和其他状态寄存器ARM中的CPSR之类的,以及CPU的值,
所有的这些东西,就叫做 当前的总体状态,就叫做content,把这些信息保存好后切换过去,就叫做content switch。
之所以要保存这些,是为了执行中断函数之后,CPU的值,还是要改成已经保存的那个值,
也就是CPU还是要再回来继续执行程序,而这些相关的信息也要同时恢复,才能正常继续执行程序的。

转载请注明:在路上 » 中断

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.182 seconds, using 22.09MB memory