版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中断技术5.1中断系统概述5.2中断源及其管理5.3中断优先级5.4中断服务程序与中断向量表5.5中断的处理过程5.6中断延迟及其改善5.7STM32中断应用组习题5
本章要点
☆中断的基本概念
☆中断的处理过程
☆嵌套向量中断控制器(NVIC)的功能
☆中断嵌套、咬尾中断、晚到异常
5.1中断系统概述
1.中断的请求—响应工作机制为保证快速响应各种随机事件,CUP通常在每条指令执行结束时,都会查询是否有中断请求,并根据相应的中断请求编号调用预先编写好的中断服务子程序。由于计算机运行速度非常快,在宏观上形成了“请求—响应”的中断工作机制,如图5.1所示。图5.1中断系统功能结构示意图
2.中断的管理
在“请求—响应”机制下,必须对众多的中断来源实施管理,决定中断源是否有权请求以及有效的请求方式。还要考虑到中断是用来处理各种随机事件,那么这些事件可能先后产生,也可能同时产生,另外事件的轻重缓急不同,而CUP在同一时间只能响应其中一个请求,各中断来源之间必然存在竞争关系,要依靠优先级管理来协调好这种竞争关系,这是中断系统需要解决的核心问题之一。最后,必须为“请求”寻找到正确的服务程序地址,使其能得到正确的“响应”。
STM32的中断功能主要由NVIC完成,图5.2是STM32的EXTI(外部中断/事件)控制器框图,在后续内容中将对STM32外部中断/事件控制器进行详细讲解。图5.2外部中断/事件控制器框图
5.2中断源及其管理
5.2.1中断源的分类最初的中断技术是作为处理器与外设交换信息的一种控制方式而提出的,中断全部来自外设,称为外部中断或硬件中断。
1.硬中断
硬中断(外中断)是由外部电路在CUP引脚上产生的中断请求。根据CUP的不同,这样的请求信号可以是电平信号,也可以是脉冲信号。CUP收到这样的信号,就知道有外部的中断请求到来,准备开始一个新的中断过程。连接到CUP的硬中断源可以不止一个,这取决于CUP有多少个可以接受硬中断请求的引脚。
作为一款应用于高实时场合的MCU,STM32的外部中断(EXTI)资源是十分丰富的,它的每一个GPIO引脚都可以设置成一个中断源,这也是STM32的强大之处。不过80个外部中断源似乎又太多了,为此STM32引入了中断线(中断通道)的概念。如图5.3所示,STM32的80个通用I/O端口中断源连接到CM3内核16个中断通道上。图5.3STM32外部中断通用I/O映像
在STM32中,中断服务程序和中断通道相对应,这样连在同一个通道上的不同中断源都会调用相同的中断服务程序,必须在中断服务程序中查询中断源的状态,明确具体的中断来源,以执行与该中断源对应的程序代码,确保服务与中断源的一一对应关系。
2.软中断
软中断不是由外部电路产生的,是在CUP执行程序过程中产生的中断请求。软中断可以由一条软中断指令产生,也可以是程序运行出现某种问题而导致的,由于来自CUP内部,也称为内部中断或内部异常。
外部中断和内部中断的区别在于,外部中断请求信号来自CM3内核的外面,来自各种片上外设和外扩的外设,产生时刻与CM3的工作时钟是异步的,在CM3中它们被称为“中断”;而内部中断则是因CM3内核的活动产生的,即在执行指令或访问存储器时产生的,因此对CM3来说是同步的,在CM3中它们被称为“异常”。在STM32中,把所有能打断正常执行流的事件都称为异常,不细致地区别到底是外部中断还是内部异常。如不加说明,则强调的都是它们对主程序所体现出来的中断性质。
5.2.2STM32的中断源
CM3内核共支持256个中断/异常源,其中外部中断最多240个。系统异常是CM3内核支持的基本异常,与具体的芯片无关,而外部中断则是与芯片相关的。芯片厂商会根据需要和用途设计中断源数目(1~240),STM32目前支持的中断共84个(16个内部+68个外部),而同样内核的NXP公司的lPC1700系列支持35个外部中断。表5.1列出了STM32的中断源,表格最后有阴影的部分表示的是外部中断。
5.2.3STM32中断源的输入管理
1.外部中断的请求与挂起
外部设备可以电平或脉冲方式发出中断请求。电平触发的中断在得到响应后,还需要撤销外部设备请求电平,这种方式下外部中断源的电路较复杂。因而STM32不接收电平触发信号。
对于STM32的外部中断来说,当发生了选择的触发请求时,图5.2中的请求挂起寄存器(EXTI_PR)对应位会置1,完成对外部中断挂起功能。还可以对软件中断事件寄存器(EXTI_SWIER)写1,设置EXTI_PR中相应的挂起位,产生一个软的外部中断。在中断服务程序中,应该通过对EXTI_PR的对应位写1,清除中断源触发产生的中断挂起位,避免CUP重复响应同一个中断请求。
2.外部中断源的屏蔽
中断系统通过中断允许/屏蔽功能决定响应哪些中断请求,或不响应哪些请求。一般来说,中断允许/屏蔽功能分多级实现。如图5.2所示,EXTI的中断屏蔽寄存器(EXTI_IMR)在每个EXTI的输入线上,通过一个与门来控制是否屏蔽某个具体的外部中断,决定某个外部中断是否能通过EXTI向CM3内核的NVIC发出中断请求。
3.NVIC的中断允许
在图5.2中,外部中断信号经过屏蔽寄存器控制后送到CM3的NVIC。NVIC支持的240个中断通道的使能与禁止分别由各自寄存器控制,每个中断通道拥有一对使能/禁止位(2位),这240对(2位)分布在8对32位寄存器中,分别是SETENA0~SETENA7和CLRE⁃NA0~CLRENA7。
4.NVIC的中断总开关
位于CUP内核的允许/屏蔽功能决定是否响应所有的外部中断,如果CUP处于不响应外部中断请求的状态,就称为关中断;如果CUP处于响应硬中断请求的状态,就称为开中断,相当于中断总开关。与前面直接通过寄存器的位进行中断屏蔽/允许控制不同,STM32的中断总开关是通过设置PRIMASK、FAULTMASK和BASEPRI寄存器中的当前中断优先级实现的,当前中断优先级相当于是一个阈值,NVIC将不响应这个阈值以上的中断。
5.事件与中断
图5.2的两个虚线箭头把一个相同的外部激励信号分为两路,上面一路信号向CUP产生中断请求,而下面一路信号经过事件屏蔽寄存器后被脉冲发生器转换成了一个单脉冲,作为“事件”输出到芯片中的其他功能模块。上面的中断需要CUP参与,需要执行软件中断服务程序才能得到预期的中断结果。
外部I/O触发A/D转换测量物品重量为例讲述二者区别。如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动A/D转换,A/D转换中断服务程序提交最后结果;如果使用事件通道,I/O触发产生事件,然后联动触发A/D转换,A/D转换中断服务程序提交最后结果。相比之下,后者不需要软件参与A/D转换触发,并且响应速度也更快,如用事件触发DMA,就可以完全不用软件参与。
5.3中断优先级
在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CUP必须确定首先为哪一个中断源服务,以及服务的次序。解决的方法是中断优先排队,即根据中断源请求的轻重缓急,排好中断处理的优先次序即优先级,又称优先权,先响应优先级最高的中断请求。另外,当CUP正在处理某一中断时,要能响应另一个优先级更高的中断请求,而屏蔽掉同级或较低级的中断请求,形成中断嵌套,如图5.4所示。图5.4中断嵌套示意图
5.3.1中断优先级的排队方法
1.用软件查询方法确定中断优先级
如图5.5和图5.6所示,优先级由查询顺序决定,先查询的中断源具有最高的优先级。图5.5软件查询接口电路图5.6软件查询程序流程
2.硬件优先级排队电路
菊花链优先级排队电路如图5.7所示。它是利用外设连接在排队电路的物理位置来决定其中断优先权的,排在最前面的优先级最高,排在最后面的优先级最低。图5.8采用比较器实现的优先级排队电路的灵活性更好一些。图5.7菊花链优先级排队电路图5.8比较器优先级排队电路
3.专用中断控制器的优先级排队
通用微型计算机本身的中断管理功能较弱,一般采用可编程中断控制器解决中断优先权的管理问题。如8259A就是一个专用的可编程的8输入中断控制器,在有多个中断源的系统中,它协助CUP实现对外部中断请求的优先级管理。其功能强,也很灵活,但使用比较复杂。
5.3.2CM3中断源的优先级划分
中断优先级的数值越小,则级别越高。
CM3中的3种系统异常(复位、NMI和硬fault)拥有固定为负数的优先级,因而它们的优先级高于其他所有异常。除此之外,其他异常的优先级都是可编程的,但不可编程为负数。
理论上,CM3支持3个固定的高优先级和多达256级的可编程优先级,并且支持128级抢占。但绝大多数CM3芯片会精简设计,实际上支持的优先级数会相对少一些,如8级、16级或32级等。在这种情况下,芯片设计者会裁剪掉优先级寄存器的部分低端有效位,以减少优先级数。以3位表达优先级的芯片为例,这也是CM3允许使用的最少优先级位数,其配置寄存器的结构如表5.2所示。
在CM3中,优先级以MSB对齐,这样可以简化不同器件间的程序移植。例如,运行在4位优先级器件上的程序,移植到只支持3位优先级的器件上后,其功能不受影响。但若以LSB对齐,则会将MSB丢失,导致优先级翻转。综上所述,以3位、5位和8位表达优先级,优先级划分情况如表5.3所示。
5.3.3优先级分组
除支持优先级可编程外,为处理多个中断源竞争CUP响应的问题,CM3引入了优先级分组机制,NVIC的应用程序中断及复位控制寄存器AIRCR>PRIGROUP[10:8]将IPR按位分成高低两段,分别是MSB抢占优先级位段和LSB子优先级位段,如表5.4所示。
需要注意,复位、NMI和硬fault
这三种具有固定优先级的异常,它们无论何时发生,都将立即无条件抢占任何优先级可编程的普通异常。
以3位[7:5]表达优先级为例,若将优先级分组寄存器设置为5,则抢占优先级与子优先级划分如表5.5所示。
可以得到4级抢占优先级,每个抢占优先级有2个子优先级。抢占关系如图5.9所示。图5.9分组后优先级抢占
可以通过调用STM32的固件库函数方式设置前面所提到的NVIC寄存器,完成STM32中断优先级的设置。选择使用哪种优先级分组方式,该函数的参数有下列5种:
5.3.4PRIMASK、FAULTMASK和BASEPRI寄存器
在CM3内核中,有一个中断屏蔽寄存器组,共包括三个寄存器:PRIMASK、FAULT⁃MASK
和BASEPRI,它们通过中断优先级控制异常的使能和禁止,常被用作中断系统的总开关。
中断屏蔽寄存器PRIMASK相当于中断总开关,最低位有效。在一些特殊应用中,把该位置1,相当于把当前有效优先级改为0(可编程优先级中的最高优先级),即关闭所有可屏蔽中断,只有NMI和硬件fault可以响应。在绝大多数应用中,应该保持其为0的缺省值,不关闭中断。可以通过_enable_irq
和_disable_irq
实现总中断的开放和关闭。
硬fault屏蔽寄存器FAULTMASK
只有最低位有效,当其置1时,把当前有效优先级改为-1,这样连硬fault都被屏蔽了,只有NMI才能响应。它的缺省值是0,表示没有关异常。FAULTMASK
寄存器在异常退出时自动清0。
在更精巧的设计中,可以利用优先级屏蔽寄存器BASEPRI对中断屏蔽进行更细腻的控制,只屏蔽优先级低于某一阈值的中断。BASEPRI最多有9位(由表达优先级的位数决定),它定义了被屏蔽优先级的阈值。当BASEPRI设定某个值后,所有优先级号大于等于此值的中断都被关闭(优先级号越大,优先级越低)。不过若BASEPRI被设为0,则停止屏蔽任何中断,0是缺省值。
5.4中断服务程序与中断向量表
5.4.1中断服务程序中断服务程序(ISR)是具体完成中断请求任务的软件实体,它由用户编程完成。一个中断源(中断通道)一定有一个与之对应的中断服务程序。每响应一次中断请求,中断系统就会调用一次中断服务程序,以完成该次中断要求的服务。
从形式上来看,例5.1与普通的子程序非常相似,但实质上中断服务程序与普通子程序存在很大的差别,主要体现在以下几个方面。
(1)服务的主体不同。
(2)调用的时机不同。
(3)调用的方式不同。
(4)中断服务程序一般没有参数和函数返回值。
5.4.2中断向量
当中断发生时,一些功能简单的CUP采用非向量中断的方式调用中断服务程序。此时,所有中断都会使CUP进入到同一个内存地址,调用同一个服务程序。用户需要在服务程序中查询不同的中断标志,以跳转到不同的程序段来执行不同的中断服务。具体过程如图5.6所示。
指令型中断向量表一般位于系统的ROM区域,其中存放的是转移指令,51单片机采用的就是这种方式:用指令跳转到对应中断服务程序的入口,如图5.10(a)所示。
入口地址型中断向量表则是在内存中直接存放中断服务程序的入口地址,ARM处理器采用的就是这种方式:具体的入口地址可以由用户写入,这样的中断向量表一般位于ARM区,如图5.10(b)所示。图5.10两种类型的中断向量表
表5.6是STM32F10xxx产品(小容量、中容量和大容量)的向量表。从该表可以看出,当发生外部中断时,将使用公式(位置+16)×4计算出中断向量表的偏移量,从中取出中断向量送往CUP的程序计数器,实现对中断服务程序的调用。
在启动代码中,还定义了默认的服务程序主体,这些都是基于固件库和CMSIS的。只要是基于固件库的中断程序设计,就可以直接调用。但由于启动代码中的服务程序是用汇编语言编写的,所以用户自己编写的中断服务程序一般不放在启动代码中,而是放在STM32F10x_it.c中,该文件是固件库的模板文件。
在固件库和CMSIS支持下,用户不必自己建立中断向量表,只需要配置好相关的外设和NVIC的寄存器,在STM32F10x_it.c
中找到对应的异常处理函数名称后,编写自己的中断服务程序。程序运行后,当该异常发生时,用户编写的程序就会被CM3的中断系统自动调用。
5.5中断的处理过程
1.中断请求当出现中断触发事件时,中断源发出中断请求,请求CUP对事件进行处理,有些中断源可能还在中断接口的相应的寄存器中设有标志位。当中断请求发出时,该标志位被置1,用于指示该中断源有中断请求产生。
2.中断判优
由于CUP在某一时刻只能为一个中断服务,根据中断系统的不同用途,必须按照一定的中断调度方式,在众多中断请求中挑选出接受CUP服务的那一个。
另外,中断之间有没有抢占行为(中断嵌套),以及如何抢占也是中断调度需要解决的重要问题。出于简化系统的考虑,在一些非实时应用中,中断嵌套功能不是必需的。
STM32采用了两段16级的中断优先级,分别是抢占优先级段和子优先级段。并规定优先级判断逻辑和嵌套规则如下:
(1)只有高抢占优先级的中断可打断低抢占优先级的中断服务,构成中断嵌套。
(2)当多个相同抢占优先级的中断同时挂起时,它们之间不能构成中断嵌套。CUP首先响应子优先级更高的中断,较低子优先级的中断只能在较高子优先级服务结束后才能得到服务。
(3)当多个挂起中断的两个优先级都相同时,先响应中断向量表地址较低的中断。
3.中断响应
成功通过判别电路的中断请求将被CUP立即响应。响应的第一个行动就是自动保存断点,以便中断返回时能回到原来的地方,继续主程序或被打断的中断服务程序的执行过程。断点包括原来程序执行时程序计数器(PC)的值和程序状态寄存器(PSR)的值。
为了节约中断响应时间,简化中断服务程序,STM32对中断响应过程进行了改进,不仅自动保存断点,也将中断服务程序经常用到的R0~R3寄存器自动保存,即断点与现场保存都是由硬件自动完成。具体而言,STM32中断响应时会依次把xPSR、PC、LR、R12以及R3~R0由硬件自动压入适当的堆栈中,如果响应中断,当前的代码正在使用进程堆栈PSP,则压入PSP;否则就压入主堆栈MSP。一旦进入了服务例程,就将一直使用主堆栈。入栈顺序以及入栈后堆栈中的内容如表5.7所示。
4.中断处理
中断处理就是中断服务程序要做的事情。一般情况下,CUP在响应中断后,都会关闭对可屏蔽中断的响应,处于关中断状态。
中断处理的工作至少包括:
(1)保护现场。
(2)根据需要开中断。
(3)中断服务。
(4)关中断。
(5)恢复现场。
5.中断返回
如果中断源有相应的请求标志位,应在返回前将其清除。
在中断处理程序中,其最后一条指令必须是中断返回指令,该指令的执行能让CUP自动将中断响应时保存的PC和其他一些重要寄存器的内容恢复,使CUP继续执行原来被中断的程序。
有的CUP有专用的中断返回指令,而ARM处理器直接使用传送指令来完成中断返回功能。
5.6中断延迟及其改善
中断请求产生到开始执行中断服务程序的第一条指令所用的时间称为中断延迟。实际上中断请求并不能立刻到响应,中断延迟总是存在的。嵌入式系统对实时性能的要求较高,中断延迟的长短也就成为系统的一个重要指标。由于实时系统考虑最多的是最坏情况,而不是平均情况,因此必须按最大延迟时间来计算中断延迟。
产生中断延迟的原因主要有以下几个方面。
(1)最长指令时间。
(2)中断向量跳转时间。
(3)保存CUP内部寄存器时间。
在断点保存和恢复上采用硬件操作堆栈,不仅简化了程序设计,也节约了在ISR中软件压栈的时间。并且当数据总线正在进行入栈操作时,指令总线也将从向量表中找出正确的异常向量,然后在服务程序的入口处预取指令。由此可以看到,CM3采用的哈佛结构指令和数据各自都有专用总线的好处:入栈与取指这两个工作能并行进行。
最终,NVIC的中断延迟是绝对固定的。从外设请求中断开始到执行中断服务程序的第一条指令只需要12个时钟周期。
此外,CM3为缩短中断延迟还做了很多努力,新增“咬尾中断”和“晚到异常”机制。
5.6.1咬尾中断
当处理器在响应异常时,如果又发生其他异常,但它们优先级不够高,则被阻塞。那么在当前的异常执行返回后,系统处理挂起的异常时,倘若还是先出栈(POP),然后又把出来的内容又入栈(PUSH)保存回去,这就白白浪费了CUP的时间。正因如此,CM3不会执行POP操作,而是继续使用上一次异常已经PUSH好的结果。这么一来,前后只执行了一次入栈/出栈操作。于是,这两个异常之间的“时间沟”变窄了很多,切入新异常服务的耗时可以缩短到6个周期。
中断咬尾的过程如图5.11和图5.12所示。
图5.12使用咬尾的情况
5.6.2晚到异常
CM3的中断处理还有另一个机制,它强调了优先级的作用,这就是“晚到的异常处理”。当CM3对某异常的响应序列还处在早期:入栈的阶段,尚未执行其服务例程时,如果收到了高优先级异常的请求,则本次入栈就成了为高优先级中断所做的了——入栈后将执行高优先级异常的服务例程。可见,它虽然来晚了,却还是因优先级高而被优先执行,这个过程如图5.13所示。图5.13晚到异常
例如,若在响应某低优先级异常#1的早期检测到了高优先级异常#2,则只要#2没有太晚,就能以“晚到中断”的方式处理——在入栈完毕后执行ISR#2。如果异常#2来得太晚,以至于已经执行了ISR#1的指令,则按普通的抢占处理,这会需要更多的处理器时间和额外32字节的堆栈空间。
在ISR#2执行完毕后,则以刚刚讲过的“咬尾中断”方式,来启动ISR#1的执行。
5.7STM32中断应用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中自我保护教育2025说课稿
- 2026年焊接用电安全知识
- 2026年美体养生专业理论知识
- 2026年大学生金融知识调查报告
- 2026年消防安全知识及使用方法
- 2026年养老服务人员面试题库精
- 2026年中小学生心理健康知识
- 2026年供销合作总社公务员招录笔试模拟题
- 小学阅读理解拓展说课稿
- 本册综合说课稿2025学年高中美术人美版2019必修 美术鉴赏-人美版2019
- 2026四川成都市简阳市中小企业融资担保有限公司招聘金融科技部人员等岗位4人笔试备考题库及答案解析
- 2026年高考考前预测卷-物理(安徽卷)(考试版及全解全析)
- 2026年广东佛山市高三二模高考化学试卷试题(含答案详解)
- 2026年湖南怀化市八年级地理生物会考真题试卷(+答案)
- 2026年食堂从业人员食品安全培训及答案
- 手术室质量控制管理手册
- 2026年医护一体化在临床护理应用方面的现状及进展分析课件
- 2026年上海市华育中学九年级语文下学期3月份月考试卷及答案
- 美军梅文(Maven)人工智能指挥系统深度战略研究报告 -欧洲“无人机墙”项目对中国低空飞行物监视与空域态势感知网络建设的启示
- AQ3067-2026《化工和危险化学品生产经营企业重大生产安全事故隐患判定准则》培训
- 2025年注册安全工程师考试金属冶炼(初级)安全生产实务试题及答案
评论
0/150
提交评论