串口中断的相关概念和原理_第1页
串口中断的相关概念和原理_第2页
串口中断的相关概念和原理_第3页
串口中断的相关概念和原理_第4页
串口中断的相关概念和原理_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、串口中断的相关概念和原理、问题上一篇讲述了串口轮询方式的发送和接收流程和相关寄存器。通过发送和接收函数的编 程实践,我们发现轮询发送和接收时,应用程序需要不停息地轮询:轮询发送缓冲区是否为 空可以发送新数据,或者接收缓冲区是否有新数据可接收。一旦发送轮询中止,发送动作也无法开启;一旦接收轮询中止、或者接收被打断或不及 时,新到的大量数据可能因接收缓冲区溢出而遭丢失。故轮询访问方式只是一种试验性的粗糙访问方式,其适用场景很有限,且占用CPU和 应用程序的大量时间、让设备忙得团团转。要想从容不迫和得心应手地访问串口,还得采用中断方式。中断机制的采用既是迫不得 已的应用需要,也是CPU设计大师们为满

2、足现实需求而积极主动创造发明的一个妙招。对中断的深入理解直至完美掌控可以说是IT人员绝技中的必备一招,把它掌控好了,就一切如羽扇 纶巾运筹于帷幄之中,就可以像浪尖上的弄潮儿一样风里来雨里去流连于浪花里之中蓝天白云之间如庄子 一样逍遥;否则,就好比一个人只会紧抱着泳圈在岸边的浑水里趟着和摸着什么;而许多疑难杂症的出现 大致都与中断的控制不善有着千丝万缕的干系。这一篇就讲述串口中断的有关概念和基本原理,但不会涉及具体的操作(留待下一讲)。 这些概念和原理中,有的是串口模块特有的,有的是所有中断模块通用的。对于我们测试人员来说,深入理解中断的技术细节、概念的来龙去脉、明白其中哪些地 方容易出现设计错

3、误,将有助于我们制定更完备的测试方案、牢牢地把控测试重点、恰当分 配测试时间和精力、提高测试效率。二、中断的类型以不同的角度或层次来划分,一个事物的分类就不一样,中断的分类也是如此。不同体 系的CPU技术手册中,对中断的分类均按照有利于自身、与自身的硬件结构相匹配的方式 来进行。这丰富了世界的多样性,却使得很多这个行当里初来乍到的人昏头转向、如理乱麻剪不断理还乱。而 有些行当里,有才能和雄心的管事者们就制定一个本行当的标准,以避免或结束混乱局面。51系列(如AT89C51)的8位单片机中,只是简单地将中断分为片内中断和片外中断 两种,片内中断又仅包括两路定时器中断和一路串口中断。51系列单片机

4、曾经如日中天、 不可一世,却已是这一时代的遗老遗少,在此就一笔带过。这里重点讲述S80CPU ZA9L0的中断分类。ZA9L0使用的是ARM9处理器(由英国ARM公司提供),该处理器文档将我们通常所 称的中断命名为exception(异常),而不是interrupt0我们还是以常规的“中断”来称呼吧。该处理器将中断划分成如下7类:1复位硬件复位引起的中断,用于系统重启。2.数据中止(Data Abort)非法访问不允许访问的地址或者非对齐的地址时,就产生该中断。所谓不允许访问的地址,是指MMU配置表中未列出的供当前模式访问的地址区 间。非对齐的地址,是针对短整数和长整数而言的地址ARM规定,短

5、整数(2字节) 应从2的整数倍位置开始存取,长整数(4字节)应从4的整数倍位置开始存取。3.快速中断请求(FIQ, Fast Interrupt Request)用于发起比IRQ能得到更快响应的中断请求。ARM规定,系统中最多只为一个模 块开这样的小灶。FIQ由谁来触发呢?这是可以设定的,即可软件配置从32个触发通道中的某一个 来触发,例如:定时器0通道。4.中断请求(IRQ, Interrupt Request)用于发起常规的内部设备或外部设备的中断请求,它是我们最需要关注的一类中 断。由于总线宽度是32位,很自然地,最多可支持固定的32个通道的子中断请求。请注意,这里说的是32个通道/ch

6、annel。由于单个GPIO中断通道(GPIO0A GPIO2B)是很多口线合用的中断,即多个模块可合用一个GPIO中断通道,故实际的 最大中断源模块个数大于32o除IC卡以外的常见模块(如:串口、定时器、打印机、MODEM、以太网控制器) 的中断都包含在这一中断类型中。ZA9L0的32种IRQ中断列示如下:ChannelNumb&rSource0TMR61WDT2UARTO3TMRO4TMR15TMR26TMR37TMR48TMR5gSman Card Alarm10Snan Card C11Sman Card 112GPIOC A13GPIOC B14GPIO1 A15GPIO1 BCha

7、nnelNumberSourceieGPIO2 A17GPIO2B18DMAC1&MCR2CDAA21SSD iDAA)22ADC2324S=I125UART12EUART227Reser;ed23RNG2&RTC3GTMR731TMRS图1 : ZA9L0的32种IRQ中断在上面的表格中,能看到9个定时器中断(TM0TM8)、三个串口中断 (UART0UART2),却没有看到打印机、MODEM、以太网控制器等模块的中断。这 三个模块难道不需要中断吗?其实,这三个模块的中断主要是以GPIO (GPIO0AGPIO2B)的形式存在的,根 据实际的硬件连接对应到相应的GPIO端口上。此外,这些模块

8、还同时使用到了定时器 中断,这也是ZA9L0大手笔地设计了 9个定时器中断的原因。由于GPIO中断是很多口线合用的中断、不像各定时器中断均是独用的中断,串口 中断还可进一步细分为发送中断、接收中断、状态中断等,其它子中断也可能有类似细 分,故从IRQ来看,ARM的中断层次最多分为三层。每一层均可再进行分类。图2: IRQ的三个中断层次示意图5.预取指中止(Prefetch Abort)当程序带错误运行时,就可能因预取指地址非法而出现预取指中止的错误和中断。因ARM取指是采用流水线的机制,所以取指都是比实际运行超前几条指令的预取 指。6.未定义指令当程序带错误运行或故意执行ARM未定义或不能处理

9、的机器指令时,就可能或必 定出现未定义指令的错误和中断。7.软中断(SWI, Software Interrupt)软中断是非常实用和重要的一个中断。软中断基本上被众多API函数用来进行安全、受限、可控的系统调用,从而间接 地、有限度地访问CPU内核资源(如:各种模块的内部寄存器、核心内存)。故,有些CPU直接将这种中断命名为SysCall,即系统调用。发起软中断的各API函数,在发起该中断之前,需要在系统约定的内存区域填写 上API编号以及对应入口参数;接着,就通过一条asm(SWI)的嵌入式汇编指令触发 一次软中断;CPU硬件探测到软中断后,就调用软中断服务例程。在软中断服务例程中,先到约

10、定的内存区域读取请求相关信息:是哪个API请求、 它的参数是哪些。再携着这些参数调用相应模块的API服务函数。最后,软中断执行完毕,程序返回到之前系统调用处的下句继续执行。这7类中断的划分,是第一层次上的划分,不仅是逻辑概念上的划分,更是硬件结构上 的划分;后面将要看到:ARM的硬件中断向量表中有7行,每行即对应各个中断的入口代 码。当出现数据中止、预取指、未定义指令等中断时,相应的中断服务程序可通过串口、屏 幕等输出断点信息(如:断点地址、断点指令、断点工作模式、有关变量等),以便分析和 追踪出错原因。三、中断的并发、嵌套与优先级单个中断的响应过程有些中断是应用程序通过API有意发起的,如:

11、软中断、串口的发送中断,发起后CPU 将跳转到相关中断服务程序中运行;更多的中断不是应用程序直接发起的,而是人机接口、 某些模块或外部设备触发的。中断触发后,CPU 一旦执行完当前的机器指令,就开始从软硬件上响应该中断。先是硬件上的响应(由ARM内核自动完成):保存断点地址到专用的断点寄存器中。保存CPU的断点状态到专用的状态备份寄存器中。切换到中断模式;对于IRQ、FIQ来说,还要关闭相应IRQ或FIQ总中断控制位(位 于状态寄存器中)。固定地跳转到相应的中断服务程序首句。之前总结了第一层次上ARM共有7类中断,“固定地”意味着每类中断都规定着 一个唯一的中断服务程序首句地址,不可由软件来重

12、设置和更改,该地址上只能存放相 应中断服务程序的首个语句,不能作其它任何用途。这一点是ARM CPU的特有固定规 则。这个中断向量表的地址列示如下:AddressExceptionMode in Entry0 x00000000ResetSupervisor0 x00000004Undefined instructionUndefined0 x00000009SofbAare InterruptSupervisorOxOOOOOOOCAbort (prefetch)Abort0 x00000010Abort (dataAbort0 x00000014R&ser/edR&ser/ed0 x000

13、00019IRQIRQOxOOOOOOICFIQFIQ图3: ARM中断向量表可见,中断向量表是从0地址开始顺序存放的,有7个可用的,另外1个保留未用 的。特别提请注意和区别,ARM的中断向量表中不像其他CPU那样是存放中断服务程 序的入口地址,而是存放的语句;由于对每个中断均只有一个语句的空间,不可能把中 断服务程序的整体放进来,故存放的语句只能是跳转语句。例如,复位中断对应的汇编语句为:LDR PC, ResetHandler这句话等同于C语言中的:ResetHandler();其中,ResetHandler()是复位中断的服务函数名。接着,软件上的响应即是中断服务程序的执行过程,一般有如

14、下内容:对于IRQ来说,打开相应IRQ总中断控制位(位于状态寄存器中),便于更高子优先 级的IRQ中断能被响应。对于FIQ来说,在该服务期间相应FIQ总中断控制位一直处于关 闭状态、不会打开。执行数据的搬移,操作对象为:数据缓冲区、模块寄存器等。对于IRQ和FIQ来说,响应和确认中断,以便从中断控制器中解除该中断的挂置 (Pending)状态、确定本次中断服务结束。从中断服务中跳回到断点。对于FIQ来说,相应FIQ总中断控制位会同时被复原和打 开。并发中断的响应对于任何CPU来说,可以执行的最小指令单位是一条机器指令,机器指令好比一个原 子,不可再切分,即使中断也无法切分它。这意味着,中断可以

15、切割和打断一个进程的执行、一个函数的执行、一条高级语言语句 的执行,但是,当一条机器码正在执行时,中断也只能眼睁睁地等着它执行完毕后才能被响 应。在CPU执行一条机器码的期间,也许有两个中断源先后(例如相差0.5个纳秒)触发 了中断,我们认为这样的两个中断源相对于一个机器指令的整体来说是并发的。ARM规定,对并发的中断先响应固定级别更高的中断。以下是ARM规定的优先响应 级别(从高到低排列):ResetData abortFIQIRQPrefetch abortE. Undefined Instruction, Software interrupt.图4: ARM的固定中断优先级这里,7种中断

16、只有6个优先级,是因为未定义中断和软中断是不会同时发生的中断。.中断的抢占与嵌套当一个中断正在响应尚未结束时,另一个中断是否可被响应?注意,这里仅从第一层为着眼点来考虑。有如下两种情况需要考虑:不同中断源一个中断正响应时,另一不同的中断是否可被响应?按照上述图3所示的优先级,一个中断响应时,另一更高优先级的中断会被响应,而同 等和更低优先级的中断不会被响应。例如:IRQ (优先级4)中断期间,FIQ中断(优先级3)可被响应,而软中断(优先 级6)却不会被响应。这种更高优先级的不同中断打断更低优先级中断的执行,称为中断的抢占。同一中断源一个中断正响应时,同一中断是否可再被响应?对于7种中断中除I

17、RQ和FIQ之外的其它5种中断,正响应时,同一中断源不会再引 起触发。对于IRQ,由于它包含32个通道的子中断请求、且这些子中断也有优先级,故在相应 IRQ总中断控制位被开启后,更高优先级的子中断会被响应、同等和更低的不会被响应。对于FIQ,由于它只能包含1个通道的中断请求,故只有在该中断被响应和确认且FIQ 总中断控制位被开启后,同一FIQ中断才能再被响应。IRQ32个通道的子中断优先级共有8级(07, 0最高,7最低),每个通道具体选择哪 一级,可由系统驱动程序根据总体设计方案自行配置。从第一层看起来,这种更高优先级的同一类中断打断更低优先级中断的执行,称为第一 层中断的嵌套。而从第二层I

18、RQ的32个通道看起来,是不同通道的中断抢占。而从IRQ第三层来说,在中断驱动软件上应切实避免此层同一中断源的嵌套响应,这 样的嵌套响应会带来严重问题。具体避免措施以后会讲。四、中断有关的原子操作需要一口气完成、不可被中断或线程进程所打断的CPU操作,称为原子操作。原子操作是为了防止特定的共享资源被两个不同的程序同时访问而遭到破坏或导致异 常。根据不同的操作场合,原子操作可以是一条或几条机器码、一条或几条高级语言语句、 一个或几个函数等。为什么需要原子操作呢?一般来说,中断服务程序和API程序都需要访问(如:加/减、与/或)共享的变量(如: 已接收字节计数器),而常规CPU对一个变量的高级语言

19、操作均不是一条机器码就可完成 的,需要多条来完成,普遍会采用寄存器来作中间传递。当API程序访问该变量的多条机器码尚未执行完毕时,很可能发生相关联的中断。该 中断服务程序将打断API而运行自身,并也访问该变量。中断完成后,API中的变量会从中 间寄存器取值(还是中断发生之前的值,已不是变量当前值)并操作,这样就导致变量值出 错、进而引起更严重的数据访问问题。很多高级语言的讲述书中,均乐此不疲地大肆宣扬该语言的封装性、移植性、与硬件无关性等优点, 却只字不提其缺点以及其优点的适用范围,因为,显然任何事物都有两面性和适用范围。这误导了许多驱 动程序的编写者也理直气壮地不理睬CPU的硬件基础和特性、

20、还自我感觉程序的可移植性良好、却不知不 觉间埋下了一些祸患。面对很多概念和原理,需要从正反两方面才能得到全面、透彻的理解。高级语言屏蔽了很多硬件特性,驱动程序的编写者对硬件特性不一定要有入木三分的理解,但至少需 需要明察秋毫。例如,常规CPU没有提供对一个变量增一或减一的专用指令、只提供了对通用寄存器增一 或减一的专用指令。只有明白了这一硬件知识,才能显而易见一条变量增一或减一的高级语言代码不是原 子操作代码,否则,就只能如很多当事人一样事后抱着头发出感慨:料想不到啊。五、串口中断的子类型一个串口的中断是IRQ中断32个通道中的一个。ZA9L0共有3个串口,故共占用3个通道。每个串口的中断,又

21、均可分为以下几个子中断源:发送中断,即:一旦发送缓冲区为空,就产生中断。接收中断,即:一旦接收缓冲区有数据,就产生中断。状态中断,即:一旦串口模块的专用状态线有边沿或电平的变化,就产生中断。这些子中断源的任何一个被触发后,均会产生所属的串口 IRQ中断。在所属串口的中 断服务程序中,需要通过相关UART寄存器来辨别谁产生了中断、并给予服务。一般的串口没有支持硬件流控制,就仅有发送和接收两个中断源。特殊的串口(如:用 于MODEM通讯的串口)支持硬件流控制,以上三种中断源均存在。六、练习为了便于系统出错时输出跟踪信息,有人在数据中止(Data Abort)的中断服务程序 中调用串口驱动层(非API层)的中断模式发送函数PortSends()来输出信息,请问会有什 么现象出现?为什么?注:API层的PortSends()发起软中断后,软中断再调用串口驱动层的PortSends()来完成发送。假设:使用的串口号已

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论