嵌入式开发中,选中断还是轮询方式?

来源 | 技术让梦想更伟大
摸水了一周,准备在家里好好敲敲代码,赶赶稿子 , 正当我专心输出的时候 , 被老婆打断了 。
娃拉臭了,赶紧过来!语气中带着一丝丝我害怕的味道 。
怎么办?没办法只有过去换尿布咯 , 三两下,搞定!
之后 , 我继续开始肝 , 但是心想 , 要是娃再哭闹了,老婆是不是会骂人了?
想着不行,我得去看看 , 于是我每隔几分钟就去瞅瞅,媳妇看到我这么用心,笑开了花!
是的,从中我也悟出了中断与轮询的味道,今天我们来看看这两者的内涵与区别 。
中断
在嵌入式开发过程中,使用到处理器的时候,中断是我们必不可少的元素 。
中断的基本概念
中断是一种硬件机制,在CPU在正常运行程序的过程中,中断可以随时发生 。
由预选安排或各种随机的内外部事件,一般称为中断源,发出中断请求,使CPU中断正在运行的程序,并通过将控制权传递给服务设备的中断处理程序来响应,这个过程称为程序中断 。
中断的本质
一般认为中断是外部设备向处理器发起的请求事件,这还不够彻底 , 中断可以说是是处理器对外开放的实时受控接口 。
比如计算机系统中,如果没有中断 , 计算机所有的程序都是定论的,我们事先就可以知道其运行的全部过程,无法交互 , 相当于一个加速器 。
有中断后,外部服务程序可能打断当前任务 。
CPU“正在执行的程序”与“随时可能发生的服务”,二者形成了异步关系,由人实时控制的中断输入,是无法预测的 。
中断可以看作是一种“硬件轮询” 。即本质上,CPU会通过读取外部信号来判断CPU的下一步状态 。
中断处理方式
设备管理中 , 高速的处理器和低速的输入输出设备相对来说,会降低整体效率,为了减少程序直接控制方式中CPU的等待时间,提高系统的并行工作程度,采用中断处理方式是很有必要的 。
在I/O设备中断方式下,CPU与I/O设备之间数据的传输步骤如下:
在某个进程需要数据时,发出指令启动输入输出设备 , 准备要处理的数据;
在进程发出指令启动设备之后,该进程放弃处理器,等待相关I/O操作完成 。此时 , 进程调度程序会调度其他就绪进程使用处理器 。
当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转向预先设计好的中断处理程序,对数据传送工作进行相应的处理 。
得到了数据的进程,转入就绪状态 。在随后的某个时刻,进程调度程序会选中该进程继续工作 。
CPU是怎么知道中断发生的
举个例子,比如说键盘,按下键盘Enter键时,cpu是怎么样知道我按下了Enter键而不是Shift键呢?
首先说明cpu不会知道你按下的哪个键,cpu只会按着机器指令的执行顺序 , 一条一条的执行机器指令 。
cpu只知道按设计好的逻辑执行指令,不管这个指令是干嘛的 。
知道你按下哪个键的是操作系统,操作系统是根据中断控制器以及相应的寄存器的状态判断是不是中断 。
所以当你按下一个键 , 这个键的地址马上被写入RAM中,同时发出中断信号,CPU获取中断信号,就会去执行中断程序 。
发生中断时CPU怎么知道程序的地址?
中断产生时,程序需要跳转到某个地址去运行该段的程序,那么CPU是不是要读整个内存然后去找中断向量表呢?
不是的,不需要去读取整个内存,而是通过映射的关系 。
例如在x86架构中,中断向量表的位置保存在IDTR寄存器里 , CPU通过这个寄存器就能找到中断向量表,然后根据中断号就可以找到具体的中断入口了 。
CPU检测到中断信号时,怎么知道是发给哪个进程的?
这个问题是我在知乎上看到的 , 也是极大激发我的兴趣,对我们理解中断也有极大的好处 。
首先我们需要知道:中断并不直接把数据送给用户进程的,中断通知的是驱动程序,而不关心当前正在执行的是哪个进程 。
而进程操作都是一样的:保存现场,进入内核,执行需要的操作,返回中断前的现场,继续进程执行 。
一个系统的的中断系统通常是类似这样的组成,包括设备的中断、中断控制器、CPU的中断
设备的中断
指设备要产生一个事件来通知CPU,事件的产生的方法有很多 。对设备“关中断”,指的是让这个设备停止发出中断信号,如果中断控制器已经获得这个中断信号 , 那么这个中断信号还是会报到CPU上的 。
中断控制器
指对多个设备的中断进行采样,排队,分发的机制 。对中断控制器说:关中断,是让中断控制器不要给CPU(或者上级)发送中断信号了 , 设备报不报信号上来,这些信号是否被排队,那是另一个问题 。
CPU的中断
指CPU核上有一条中断线,当这条线加上合适的电平或者信号,CPU核就会从当前的执行上下文中,直接跳转到中断处理程序中执行 。在CPU的角度上关中断,就是不要执行“跳转到中断处理程序”这个动作 。
中断方式的优缺点 优点
I/O设备中断方式使处理器的利用率显著提高;
支持多道程序和I/O设备的并行操作,提高了效率 。
缺点
各种各样的输入输出设备通过中断处理方式进行并行操作 , 使中断次数增加,会造成CPU无法响应中断;
如果在缓冲区装满数据之后发生中断 。那么在数据传送过程中,发生中断的机会较多,将耗去大量的CPU处理时间 。
轮询 什么是轮询
轮询是一种CPU决策如何提供周边设备服务的方式 。
在轮询过程中,由CPU定时发出询问,依序询问每一个周边设备是否需要其服务 。
每个设备都有一个指示命令就绪的位,指示该设备的状态 。
当此状态就绪即给予服务 , 服务结束后再问下一个周边,接着不断周而复始 。
轮询方式
I/O设备的程序轮询是计算机系统对I/O设备的一种管理方式 。它定时对各种设备轮流询问一遍有无处理要求 。
轮流询问之后,有要求的 , 则加以处理 。
在处理I/O设备的要求之后,处理机返回继续工作 。
轮询的优缺点
优点
在一些应用中可以增强了程序的实时性...
缺点
能处理的输入输出设备的数量也是有一定限度的 。
程序轮询占用CPU的处理时间,效率较低 。
中断和轮询之间的区别
中断时,设备会通知CPU引起注意;而在轮询中,CPU会稳定地检查设备是否需要注意 。
中断不是协议,而是一种硬件机制;轮询反之 。
在中断中,该设备由中断处理程序提供服务;轮询时 , 该设备由CPU维修 。
中断可以随时发生;轮询时,CPU会以固定的间隔稳定地对设备进行投票 。
在中断中,中断请求线用作指示设备需要维修的指示;在轮询时,命令就绪位用作指示,表明设备需要维修 。
在中断中,一旦任何设备将其中断,处理器就会受到干扰;在轮询中,处理器通过重复检查每个设备的命令就绪位来浪费无数的处理器周期 。
【嵌入式开发中,选中断还是轮询方式?】巨人的肩膀