2.4 并行与串行通信、中断、定时器/计数器概述
在设计微型计算机应用系统时,经常用到并行通信、串行通信、中断系统、定时器/计数等概念,在这里先对这些问题进行基本说明。
2.4.1 并行通信与串行通信
计算机与外设之间或计算机之间的信息交换或数据传输称为通信(Communication)。基本的通信方式有两种,一种是并行通信,另一种是串行通信。
1.并行通信
并行通信是指数据的各位同时进行传送,如图2-12 所示。在计算机系统中,CPU与存储器、主机与打印机之间的通信,一般采用并行通信。在并行通信中,有多少位数据,就需要多少条传输线,因此传送速度较快,即在相同传输率的情况下,并行通信能够提供高速、高信息率的传输。
图2-12 并行通信方式示意图
由于并行通信所需的传输线较多,如果传输距离增加,传输线的开销会成为一个突出的问题,因而并行通信一般用于数据传输率要求较高、传输距离又比较短的场合。
2.串行通信
串行通信是指数据一位一位地按顺序传送,如图2-13所示。串行通信时,要传送的数据或信息必须按一定的格式编码,然后在单根线上,按一位接一位的先后顺序进行传送,发送完一个字符,再发送第二个。接收数据时,每次从单根线上一位接一位地接收信息,再把它们拼成一个字符,送给CPU做进一步处理。
图2-13 串行通信方式示意图
串行数据传送的特点是:数据传送按位顺序进行,最少只需一根传输线即可完成,成本低但速度慢。计算机与外界的数据传送大多数是串行的,其传送的距离可以从几米到几千千米。
现在,在数据传输过程中越来越多地使用串行通信,主要原因是串行通信技术中的信号传输的干扰小。并行传输可以同时传送多位数据,数据传送较快,但由于并行电缆的多股线未进行单线屏蔽,相互之间的干扰较大,特别是在工作频率较高时干扰会更厉害,因此并行通信的工作频率一般不高。串行通信是建立在“点对点”基础上的,信号的干扰小,通过提高工作频率,传输能力可以很方便地得到提高。相对于并行通信,串行通信技术较容易实现,串行通信电缆即接头较容易制造,成本低廉。目前大量使用的USB和IEEE 1394接口,更是体现了串行通信的发展趋势。
采用串行通信方式的另一个出发点是,有些外设如调制解调器(Modem)、鼠标等,本身需要用串行通信方式,因为这些设备是以串行方式存取数据的。
串行通信中的其他问题,如同步与异步、波特率、数据传送方式等,将在下面的相应章节中进行说明。
2.4.2 中断
“中断”是CPU与外设交换信息的一种方式。计算机引入中断技术以后,解决了CPU和外设之间的速度配合问题,提高了CPU的效率。有了中断功能,计算机可以实时处理控制现场瞬时变化的信息、参数,提高了计算机处理故障的能力。因此,计算机中断系统的功能也是鉴别其性能好坏的重要标志之一。
中断方式的接口比查询方式复杂,中断方式的应用也比无条件传送和查询方式传送复杂,因为中断的应用既与外部的中断源有关,也与CPU本身的中断机制有关,而且不同的CPU的中断机制很不相同。
1.概述
对于中断,我们可以举一个日常生活中的例子来说明。假如小张正在计算机前工作,电话铃响了,这时小张放下手中的鼠标键盘去接电话。通话完毕,再继续原来的计算机中的工作。这个例子就表现了中断及其处理过程:电话铃声使小张暂时中止当前的工作,而去处理突发性的或急需处理的事情(接电话),把实时处理的事情处理完毕后,再回头继续做原来的事情,从而可以多任务并行处理。在这个例子中,电话铃声称为“中断请求”,小张暂停当前的工作去接电话称为“中断响应”,接电话的过程就是“中断处理”。相应地,在计算机执行程序的过程中,由于出现某个特殊情况(或称为“事件”),使得暂时中止现行程序,而转去执行这一事件的处理程序,处理完毕之后再回到原来程序的中断点继续向下执行,这个过程就是中断。
(1)中断、中断源与中断请求
所谓中断,是指CPU正常运行程序时,由于微处理器内部事件或外设请求,引起CPU中止正在运行的程序,转去执行请求中断的外设(或内部事件)的中断服务程序,中断服务程序执行完毕,再返回被中止的程序。利用中断可以避免不断检测外设状态,提高CPU的效率。
引起中断的原因,或是能发出中断申请的来源,称为中断源。中断源有外部中断和内部中断,内部中断由程序预先安排的中断指令引起,或由于CPU运算中产生的某些错误(如除法出错、运算溢出)引起。外部中断是外设或协处理器向CPU发出的中断申请引起的,外部中断又称为硬件中断。
中断源向CPU发出中断信号的过程称为中断申请或中断请求;CPU执行中断服务程序的过程称为中断响应;为相应的中断源而编写的程序称为中断服务程序;中断服务程序在内存中存放的首地址称为中断服务程序入口地址。
(2)可屏蔽中断与非屏蔽中断
可屏蔽中断有时也称为直接中断。屏蔽是指CPU可以不处理的中断请求。这种屏蔽实际上是CPU的一种工作方式,可以通过软件(指令)来设置,也就是可以通过指令,使CPU或者允许接受中断请求,或者不接受中断请求。具体的指令由CPU的指令系统来决定。可屏蔽中断是最常见的一种中断方式,所有的微处理器都有这种中断方式。
对非屏蔽中断来说,如果该中断源申请了中断,CPU是一定要处理的。CPU不可以也不能用软件将该中断屏蔽掉。一般一些紧急的情况,如掉电中断申请,就可以安排为这种中断方式,以保证紧急情况一定能得到处理。但并不是所有的微处理器的中断系统都有这种中断方式,MCS-51单片机的中断系统就没有非屏蔽中断。
(3)中断的开放与关闭
中断的开放与关闭,亦称为开中断和关中断,是指CPU中断系统的状态,只有当CPU处于开中断状态时,才能接受外部的中断申请。反之,当CPU处于关中断状态时,则不能接受外部的中断申请。
CPU具有开中断和关中断状态,和CPU是否接受屏蔽中断申请是一致的。当CPU处于关中断时,也就是对外实现了中断的屏蔽。CPU只有在开中断的状态下,才可以接受屏蔽中断申请。中断的开放与关闭和非屏蔽中断无关。
CPU有开中断状态和关中断状态是中断系统工作的需要。当CPU在开中断状态下接受了一个外设的中断申请时,就应该处理这个外设要求CPU完成的工作。在此期间,一般来说,CPU不应该再去接受其他的中断申请,而是应该把中断关闭,一心一意地为已接受的中断申请服务。而当中断服务完毕之后,则使中断开放,以便接受新的中断申请。所以,开/关中断状态的存在与设置是完成中断系统的工作所不可缺少的。
(4)中断优先级
当有多个中断源请求中断时,中断系统判别中断申请的优先级,CPU响应优先级高的中断,挂起优先级低的中断。CPU在运行中断服务子程序时,若有新的更高优先级的中断申请进入,则CPU要挂起原中断进入更高级的中断服务子程序,实现中断嵌套功能。中断嵌套的示意图如图2-14所示。
图2-14 中断嵌套示意图
(5)中断处理程序
中断处理程序也称为中断服务程序,是中断源要求CPU执行的功能操作。
2.中断系统的功能
对于各种计算机系统,中断系统的构成差别很大,但都具有如下基本功能:
① 能实现中断响应、中断服务、中断返回、中断屏蔽。
② 能实现中断优先级排队。
③ 能实现中断嵌套。
3.中断处理过程
对于不同的计算机,中断处理的具体过程可能不尽相同,即使是同一台计算机,由于中断方式的不同(如可屏蔽中断、非屏蔽中断等),中断处理也会有差别,但是基本的处理过程应该是相同的。一个完整的中断处理的基本过程应包括:中断请求、中断优先权判别、中断响应、中断处理及中断返回。
(1)中断请求
中断请求是中断源(或者通过接口电路)向CPU发出信号,要求CPU中断原来执行的程序并为它服务。中断请求信号可能是电平信号,也可能是脉冲信号。CPU能够接受的中断请求信号则随CPU而定。
外设向CPU发出中断请求信号需要两个条件:
① 外设本身的工作已经完成,如键已按下、光电输入机已准备好数据、实时时钟的定时时间已到等,才可向CPU申请中断。
② 计算机系统允许该外设发中断请求信号。如果系统由于某种原因不允许它发中断请求,即使外设本身的工作已经完成并发出了状态信号,对应的I/O接口电路也不发出中断请求信号,这称为接口电路中断屏蔽或中断禁止。反之,则称为接口电路中断允许或中断开放。
满足上述两个条件后,中断源可以向CPU提出中断请求。但CPU是否响应中断,还取决于它是处在允许中断状态还是处在禁止中断状态。这由CPU内部设置的中断允许触发器控制。中断允许触发器的状态由软件控制,这样CPU可处在中断允许状态或中断开放状态,或可处在中断屏蔽状态或中断禁止状态。
(2)中断优先权判别
一个计算机系统常有多个中断源;同一中断请求引脚也可以接有多个可以提出中断请求的外设,如图2-15 所示。遇到几个设备同时中断请求时,CPU先响应谁,这就有一个中断优先权的问题。
图2-15 同一中断源请求引脚有多个外设
中断优先权有3条原则:
① 多个中断源同时申请中断时,CPU先响应优先权高的中断请求。
② 优先权级别低的中断正在处理时,若有级别高的中断请求,则在高级别中断服务程序执行完后再返回低级别中断服务程序继续执行,这称为中断嵌套。
③ 同级别或低级别的中断源提出中断请求时,CPU要等到正在处理的中断服务程序执行完毕返回主程序,并执行了主程序的一条指令后,才接着响应。
中断源中断优先权的高低有的是在计算机设计、制造时就规定了的,例如有的计算机规定掉电、故障处理等中断请求的优先权级别高于一般中断请求。有的是让用户自己安排的,这可以采用硬件办法,也可以采用软件办法。例如,将许多会提出中断请求的外设用电路连接成一个链,外设越排在前面,优先权越高,连成链的逻辑电路使排在后面的外设只有在它前面各外设均不中断请求时才能提出中断请求,当前面的外设有中断请求时,将屏蔽后面各外设的中断请求或中断后面外设原已进入的中断服务程序。软件办法采用查询手段依次询问各外设有未提出中断请求,如有则转去为该外设服务,如无则循序询问下一个外设,这样先查询的外设优先权高,后查询的外设优先权低。
(3)中断响应
如果提出中断请求的中断源优先权高,而且接口电路与CPU都中断开放,CPU将响应中断,自动执行下列工作:
① 保留断点:中止正在执行的程序,并对断点进行保护,即将断点地址的值压入堆栈保存,以便中断服务程序执行完后能返回断点处继续执行程序。
② 转入中断服务程序:将中断服务程序的人口地址送入PC,以转到中断服务程序。各中断源要求服务的内容不同,所以要编制不同的中断服务程序,它们有不同的入口地址。CPU首先要确定是哪一个中断源在申请中断,然后将对应的入口地址送入PC。
(4)中断处理
中断处理也称为中断服务,实际上就是在执行中断服务程序。在中断服务程序中,一般要完成以下工作:
① 保护现场:根据需要把断点处有关寄存器的内容推入堆栈保护。因为CPU的寄存器无论是在调用程序和被调用程序中都是可以使用的。如果某些寄存器在主程序中已经保存了数据,并且在以后的执行中还要继续使用,而在中断服务程序中也要用到这些寄存器,则原来的数据就会被新的数据取代,以后主程序再使用这些数据就要出错。
因此,对于子程序中要使用的寄存器,一般都应先推入堆栈加以保护。具体应保护哪些寄存器的内容,则应视情况而定。
② 处理开/关中断:一般的中断系统在响应中断后是自动关中断的,在退出中断服务程序前,一定要恢复到开中断的状态,以便CPU在结束这次中断处理后,接受和处理其他的中断申请。
另外,进入中断服务程序后,需要考虑是否还允许其他中断源申请中断。
③ 执行中断服务程序:中断服务的核心就是执行中断服务程序,对于程序设计者来说,就是要根据外设和CPU交换数据的要求,编写中断服务程序。
④ 恢复现场:在结束中断服务程序之前,要将推入堆栈保护的寄存器内容,弹出到各自所属的寄存器,以便回到主程序后,继续执行原来的程序。
⑤ 结束中断服务程序:中断服务程序的最后必须有一条中断返回指令,用以结束中断服务程序的执行。
(5)中断返回
中断返回是在中断服务程序,用一条返回指令来实现的。此时,CPU将压入堆栈保护的断点地址弹出到计数器PC,从而使CPU继续执行中断了的主程序。
2.4.3 定时器/计数器
计算机系统在工作过程中都需要时间基准,尤其是在工业控制系统中,常常要进行定时或对外部事件的计数。定时器/计数器在计算机控制系统中有着广泛的应用,它可以在多任务的分时系统中提供精确的定时信号以实现各任务间的切换,如计算机实时系统中常用定时对多个被控对象进行采样、处理,或者对某一工作过程进行计数等。另外,微机中系统时钟日历、动态存储器的刷新及扬声器的工作也需要由定时器/计数器提供时钟信号。
1.定时和计数是同一回事
在微型计算机中,定时和计数都是一个计数的问题。
定时是从某一时刻开始,经过多长时间之后干什么;计数是从某一时刻开始,计满多少个数之后干什么。
对周期固定信号的计数就转换为定时。
2.系统定时的分类
定时/计数的方法归纳起来有两类,即软件定时和硬件定时。硬件定时又可分为不可编程的硬件定时和可编程的硬件定时。
(1)软件定时
若用软件方法来定时,则一般都根据所需要的时间常数来设计一个延迟子程序,延迟子程序中包含一定的指令,设计者要对这些指令的执行时间进行严密的计算或者精确的测试,以便确定延迟时间是否符合要求。软件定时方法的优点是不需要添加硬件电路,只需编制有关延时程序即可。缺点是定时过程中CPU一直在执行该延时程序,占用了CPU的时间,降低了CPU的利用率,定时时间越长,CPU的开销越大,而且不能响应中断,否则定时就不准确。因此这种方法常用于较短时间的定时,如用软件延时来消除机械按键的抖动等。
(2)不可编程的硬件定时
不可编程的硬件定时主要是指用单稳态电路或计数电路来实现的延时和定时。在单稳态延时电路中,用一个脉冲输入去触发一个单稳态电路,产生一个持续时间间隔恒定的单脉冲。单稳态延时电路存在时间常数由外接的电阻电容值决定而不便加以改变的缺点,另外,电路调试比较麻烦,时间一长,电阻电容器件老化,电路工作不稳定,会严重影响定时的准确度和稳定性。常用的不可编程的硬件定时器如555定时器。
(3)可编程的硬件定时
可编程硬件定时,实际上是一种软、硬件相结合的定时方法,是为了克服单独的软件定时和硬件定时的缺点,而将定时电路做成通用的定时器/计数器并集成到一个硅片上,其定时参数和工作方式可用软件来控制。
这种定时器/计数器芯片可直接对系统时钟进行计数,通过写入不同的计数初值,可方便地改变定时时间,且定时期间不需要CPU的管理,如Intel公司的Intel 8253定时器/计数器。
用可编程定时器/计数器电路进行定时时,先要根据预定的定时时间,用指令对定时器/计数器芯片设定计数初值,然后启动芯片进行工作。计数器一旦开始工作,CPU就可以去做别的事情,等计数器计到预定的时间,便自动产生一个输出信号,该信号可用来向CPU提出中断请求,通知CPU定时时间已到,使CPU做相应的处理,或者直接利用输出信号去启动设备工作。
这种方法不但显著提高了CPU的利用率,而且定时时间由软件设置,使用起来十分灵活方便,加上定时时间又很精确,所以获得了广泛应用。
3.可编程定时器/计数器的基本功能
在微机系统中,定时器/计数器的功能主要体现在以下几个方面:
① 以均匀分布的时间间隔中断分时操作系统,以便切换程序。
② 向I/O设备输出精确的定时信号。如在监测系统中对被测点的定时采样、在打印程序中的超时处理、在读键盘时的延迟去抖动处理等。
③ 检测外部事件发生的频率或周期,如CPU风扇转速测量等。
④ 统计外部某过程(如实验、生产及武器发射等过程)中某一事件发生的次数。如生产线上对零件的统计、高速路上车流量的统计等。
4.可编程定时器/计数器工作原理
可编程定时器/计数器的核心部件是一个计数器,计数器的工作就是对输入到该计数器的信号进行计数。计数器有两种,分别为加法计数器和减法计数器。对于加法计数器,是在初值的基础上来一个信号,计数器的值加1;对于减法计数器,则是在初值的基础上来一个信号,计数器的值减1。
作为计数器,即在设置好计数初值(时间常数)后,便开始减1(或加1)计数,减为0(或加到溢出时)时,输出一个信号;作为定时器,即在设置好定时常数后,便进行减1(或加1)计数,减为0(或加到溢出)时,输出一个信号。从定时器/计数器内部来说,两者的工作过程没有根本差别,都是基于计数器的减1(或加1)工作。典型的定时器/计数器的原理结构图如图2-16所示。
图2-16 定时器/计数器基本原理图
在可编程的定时器/计数器中,还应包括控制寄存器,以选择不同的工作方式。