CPU中断与查询方法的区别
中断与查询的区别
解释一、
中断方式,是事件触发的,换言之只要有事件产生都会进入中断,并且取得最优运行,因此响应更快,及时。
查询方式,就是在主函数里面不停循环,查询端口状态,明显其弊端在于响应速度,在处理事件多,处理流程复杂,函数嵌套执行的情况下,由于处理不过来容易丢失事件。
举个例子,在电话用户接入系统里面,一个单片机管理1个电话端口的摘挂机,执行周期要求8ms ,用查询的方式足够了,但是当电话增加到16个,用查询方式,效果就差了,曾出现过电话响起的时(12个电话齐呼),拿起话筒,电话还在振铃,明显处理不过来。
这个时候,有两个办法,一个采用中断方式,另一个采用更高效的CPU ,明显前者只需要修改软件,后者需要增加硬件成本,还延长开发时间。
解释二、
把CPU 比作人,定时器比作闹钟的话,中断就相当于是人设定的时间到了闹钟自己响起的过程,此时人放下手中的事去做另一件事,而查询就是人发现自己有充足的计划支配权,看一下钟,确定是否到了做计划上的某件事的最佳时间。总而言之,中断时CPU 是被动的用于处理计划外的紧急情况而具有电路层面上的优先级,查询时CPU 是主动的用于处理计划内的普通情况仅在软件上自己设定优先级。
(这里的计划外应指不可预测事件发生,计划内应指可预测事件发生,有些事我们不知道什么时候会发生但知道该怎么应对所以以中断触发发出应对措施,计划内的可预测事件其实就是计算编程时的选择执行过程。)
解释三、
UART(Universal Asynchronous Receiver )是通用异步收发接口,在很多芯片中都有应用。一般UART 的收与发共用
一个数据寄存器(8bit ), 通过相应的状态寄存器来判断UART 的工作情况。
接收可以有两种方式:一种是查询,另一种是中断。通常使用中断方式。
接收查询方式是通过CPU 不停读取UART 的状态寄存器,当有数据到来时,读取数据,此方法占用太多的CPU 时间,很少使用,在CPU 只做数据转发时可以考虑使用。
接收中断方式是通过数据到达后产生中断,在中断处理函数中读取数据。每一个数据(8bit )到来产生一次中断。如果在每个数据中断都调用数据处理函数, 当波特率较高,数据帧较长,数据处理时间较长时,可能会出现丢数据的情况。如果在一次中断进入后,while (数据寄存器满){读取数据},但波特率不
高时,可能出现将一帧数据分多次中断读取,给后来的数据处理带来不便。
在Windows 中是将串口(UART )当做一个文件,直接对文件进行读写操作。一般是以一个线程去查询读取数据,基本可以保证整帧数据一次全部读出。
也可以一次一个字符(8bit)来读。实际上是Windows 的底层驱动将UART (串口)数据接收之后放到一个FIFO 缓冲区中。显然在单片机或 DSP等专用芯片中也应该用一个FIFO 来缓存数据,然后在程序中读FIFO 来处理数据。
发送也可以分为两种方式:一种是查询,另一种是中断。通常使用查询方式。
发送查询方式是通过CPU 查询UART 发送寄存器的状态,当为空的时候,发送数据;当不为空时,等待(适合用while 循环判断)。
发送中断方式是将需要发送的数据存入一个缓冲区(FIFO ),当发送寄存器为空,进入中断时,将数据发送。需要注意时,一旦开启发送中断,当没有数据发送时,就会一直跳入发送中断处理函数,所以在数据发送完之后一定要关闭发送中断使能。