CPU要和外设进行通信,可以采用轮询和中断两种方式。因为轮询方式需要CPU轮询外设,查询外设是否发生中断,效率不高显而易见。于是增加了如下图的中断系统来减轻CPU负担,但是这样做效率就高了吗?本质上,采用中断系统后,CPU仍然需要每隔一小段时间去查询中断控制寄存器TCON的各位状态,以判断是否有外设中断发生,否则CPU仍旧无法知道外设的当前状态。
如上所述,中断和轮询,好像又没啥区别,CPU仍旧摆脱不了查询的命运。但是你知道让CPU直接和各个外设逐一沟通,和让CPU只与中断控制系统机构沟通,效率是完全不一样的。为了证明我的推断,我们假设,CPU外接20个不同的设备,这20个外设中在某一刻有两个外设同时中断,正好这个时候CPU来查看外设的状态,如果是轮询方式,CPU需要一一遍历20种不同的外设控制器,才能判断哪些外设刚才申请过中断,哪些外设没有申请中断。如果采用中断方式处理呢?CPU只需查询一下中断标志位,处理最高优先级的那个中断,其他的事情全交给中断系统去处理,效率提高了20倍!
从中,我们也可以发现一个现象,不论硬件设计如何巧妙,软件产品如何复杂,在设计原则上仍然是在不断的做加法。
图1. 89C51单片机中断系统的硬件框图
备注: 从上图中,我们看到89C51只有五个中断源,外接的设备比较少。现代CPU对中断系统进行了扩展,中断系统的中断寄存器也更加丰富了。