串口中断的相关概念和原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串口中断的相关概念和原理
一、问题
上一篇讲述了串口轮询方式的发送和接收流程和相关寄存器。通过发送和接收函数的编程实践,我们发现轮询发送和接收时,应用程序需要不停息地轮询:轮询发送缓冲区是否为空可以发送新数据,或者接收缓冲区是否有新数据可接收。
一旦发送轮询中止,发送动作也无法开启;一旦接收轮询中止、或者接收被打断或不及时,新到的大量数据可能因接收缓冲区溢出而遭丢失。
故轮询访问方式只是一种试验性的粗糙访问方式,其适用场景很有限,且占用CPU和应用程序的大量时间、让设备忙得团团转。
要想从容不迫和得心应手地访问串口,还得采用中断方式。中断机制的采用既是迫不得已的应用需要,也是CPU设计大师们为满足现实需求而积极主动创造发明的一个妙招。
对中断的深入理解直至完美掌控可以说是IT人员绝技中的必备一招,把它掌控好了,就一切如羽扇纶巾运筹于帷幄之中,就可以像浪尖上的弄潮儿一样风里来雨里去流连于浪花里之中蓝天白云之间如庄子一样逍遥;否则,就好比一个人只会紧抱着泳圈在岸边的浑水里趟着和摸着什么;而许多疑难杂症的出现大致都与中断的控制不善有着千丝万缕的干系。
这一篇就讲述串口中断的有关概念和基本原理,但不会涉及具体的操作(留待下一讲)。这些概念和原理中,有的是串口模块特有的,有的是所有中断模块通用的。
对于我们测试人员来说,深入理解中断的技术细节、概念的来龙去脉、明白其中哪些地方容易出现设计错误,将有助于我们制定更完备的测试方案、牢牢地把控测试重点、恰当分配测试时间和精力、提高测试效率。
二、中断的类型
以不同的角度或层次来划分,一个事物的分类就不一样,中断的分类也是如此。不同体系的CPU技术手册中,对中断的分类均按照有利于自身、与自身的硬件结构相匹配的方式来进行。
这丰富了世界的多样性,却使得很多这个行当里初来乍到的人昏头转向、如理乱麻剪不断理还乱。而有些行当里,有才能和雄心的管事者们就制定一个本行当的标准,以避免或结束混乱局面。
51系列(如A T89C51)的8位单片机中,只是简单地将中断分为片内中断和片外中断两种,片内中断又仅包括两路定时器中断和一路串口中断。51系列单片机曾经如日中天、不可一世,却已是这一时代的遗老遗少,在此就一笔带过。
这里重点讲述S80CPU ZA9L0的中断分类。
ZA9L0使用的是ARM9处理器(由英国ARM公司提供),该处理器文档将我们通常所称的中断命名为exception(异常),而不是interrupt。我们还是以常规的“中断”来称呼吧。
该处理器将中断划分成如下7类:
1.复位
硬件复位引起的中断,用于系统重启。
2.数据中止(Data Abort)
非法访问不允许访问的地址或者非对齐的地址时,就产生该中断。
所谓不允许访问的地址,是指MMU配置表中未列出的供当前模式访问的地址区间。
非对齐的地址,是针对短整数和长整数而言的地址。ARM规定,短整数(2字节)应从2的整数倍位置开始存取,长整数(4字节)应从4的整数倍位置开始存取。
3.快速中断请求(FIQ,Fast Interrupt Request)
用于发起比IRQ能得到更快响应的中断请求。ARM规定,系统中最多只为一个模块开这样的小灶。
FIQ由谁来触发呢?这是可以设定的,即可软件配置从32个触发通道中的某一个来触发,例如:定时器0通道。
4.中断请求(IRQ,Interrupt Request)
用于发起常规的内部设备或外部设备的中断请求,它是我们最需要关注的一类中断。
由于总线宽度是32位,很自然地,最多可支持固定的32个通道的子中断请求。
请注意,这里说的是32个通道/channel。由于单个GPIO中断通道(GPIO0A~GPIO2B)是很多口线合用的中断,即多个模块可合用一个GPIO中断通道,故实际的最大中断源模块个数大于32。
除IC卡以外的常见模块(如:串口、定时器、打印机、MODEM、以太网控制器)的中断都包含在这一中断类型中。
ZA9L0的32种IRQ中断列示如下:
图1:ZA9L0的32种IRQ 中断
在上面的表格中,能看到9个定时器中断(TM0~TM8)、三个串口中断(UART0~UART2),却没有看到打印机、MODEM 、以太网控制器等模块的中断。这三个模块难道不需要中断吗?
其实,这三个模块的中断主要是以GPIO (GPIO0A ~GPIO2B )的形式存在的,根据实际的硬件连接对应到相应的GPIO 端口上。此外,这些模块还同时使用到了定时器中断,这也是ZA9L0大手笔地设计了9个定时器中断的原因。
由于GPIO 中断是很多口线合用的中断、不像各定时器中断均是独用的中断,串口中断还可进一步细分为发送中断、接收中断、状态中断等,其它子中断也可能有类似细分,故从IRQ 来看,ARM 的中断层次最多分为三层。每一层均可再进行分类。
图2:IRQ 的三个中断层次示意图 复位 IRQ FIQ ...... TMR0 UART0GPIO1A GPIO1发送中断 ......
接收中断
状态变化中断
5.预取指中止(Prefetch Abort)
当程序带错误运行时,就可能因预取指地址非法而出现预取指中止的错误和中断。
因ARM取指是采用流水线的机制,所以取指都是比实际运行超前几条指令的预取指。
6.未定义指令
当程序带错误运行或故意执行ARM未定义或不能处理的机器指令时,就可能或必定出现未定义指令的错误和中断。
7.软中断(SWI,Software Interrupt)
软中断是非常实用和重要的一个中断。
软中断基本上被众多API函数用来进行安全、受限、可控的系统调用,从而间接地、有限度地访问CPU内核资源(如:各种模块的内部寄存器、核心内存)。
故,有些CPU直接将这种中断命名为SysCall,即系统调用。
发起软中断的各API函数,在发起该中断之前,需要在系统约定的内存区域填写上API编号以及对应入口参数;接着,就通过一条asm("SWI")的嵌入式汇编指令触发一次软中断;CPU硬件探测到软中断后,就调用软中断服务例程。
在软中断服务例程中,先到约定的内存区域读取请求相关信息:是哪个API请求、它的参数是哪些。再携着这些参数调用相应模块的API服务函数。
最后,软中断执行完毕,程序返回到之前系统调用处的下句继续执行。
这7类中断的划分,是第一层次上的划分,不仅是逻辑概念上的划分,更是硬件结构上的划分;后面将要看到:ARM的硬件中断向量表中有7行,每行即对应各个中断的入口代码。
当出现数据中止、预取指、未定义指令等中断时,相应的中断服务程序可通过串口、屏幕等输出断点信息(如:断点地址、断点指令、断点工作模式、有关变量等),以便分析和追踪出错原因。