STM32的"异常“、“中断”和“事件”区别和理解

发布者:TranquilDreamer最新更新时间:2018-12-03 来源: eefocus关键字:STM32  异常  中断  事件 手机看文章 扫描二维码
随时随地手机看文章

1 异常与中断(Cortex-M3)


1.1 异常与中断


原话: 


Cortex‐M3 在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。 


其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。 

除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。 

所有能打断正常执行流的事件都称为异常。


异常的概念包含中断的概念,即中断是异常的子集。


异常与中断都是硬件支持的。


异常表: 

异常表


外部中断表: 

外部中断表

这里的“外部中断”不是指STM32中的EXTI中断,而是所有中断。


1.2 优先级


原则上,CM3 支持 3 个固定的高优先级和多达 256 级的可编程优先级,并且支持128级抢占(preempt)优先级和128 级亚优先级。但各厂商会做裁剪。


  1. 抢占优先级即高抢占优先级任务可以打断正在执行的低抢占优先级任务,而让CPU转而执行高抢占优先级任务。


  2. 亚优先级则为多个相同抢占优先级、不同亚优先级的任务同时请求异常时,CPU会先执行高亚优先级的任务。


  3. 抢占优先级也有称为“先占优先级”。


  4. “亚优先级”也有会被称为“响应优先级”或“子优先级”。


NVIC 中有一个寄存器是“应用程序中断及复位控制寄存器”,它里面有一个位段名为“优先级组”。


优先级组分配:(默认为7位抢占) 

优先级组


中断优先级组的配置一般在程序最初设置一次。(中途改变中断优先级组本人没有试过)


1.3 中断与悬起(挂起)


当中断输入脚被assert(确认有效?)后,该中断就被悬起。即使后来中断源取消了中断请求,已经被标记成悬起的中断也被记录下来。到了系统中它的优先级最高的时候,就会得到响应。 

但是,如果在某个中断得到响应之前,其悬起状态被清除了(例如,在 PRIMASK 或FAULTMASK 置位的时候软件清除了悬起状态标志),则中断被取消。 

当某中断的服务例程开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除。


  1. 中断输入引脚有效后,中断就被悬起,即使取消请求,也会执行。


  2. 中断是否处于悬起状态,中断请求被响应的关键。


  3. 中断响应之前,请求以脉冲方式呈现的话,仅看做一次请求(悬起不被软件清除的前提下)。 


  4. 这里写图片描述


  5. 中断被响应时,硬件清除悬起状态。


  6. 中断响应中,请求被释放,但又变为有效时,会再次悬起。 


  7. 这里写图片描述


  8. 中断响应完成之后,中断请求仍然存在,则再次悬起,等待响应。 


  9. 中断悬起


1.4 SVC和PendSV


SVC(System serVice Call):系统(服务)调用;


SVC异常是必须立即得到响应的,若因优先级不比当前正处理的高,或是其它原因使之无法立即响应,将上访成硬 fault。


PendSV(Pend System serVice):可悬起系统调用。


PendSV 则不同,它是可以像普通的中断一样被悬起的。 

PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)。


多用于操作系统软件开发中。(uC/OS-II中就用PendSV来实现任务调度)


简单的调度方式: 

1.时间轮转(SysTick) 


这里写图片描述

2. 产生一个系统调用(PendSV设置为最低优先级) 

这里写图片描述


  1. 任务 A 呼叫 SVC 来请求任务切换(例如,等待某些工作完成)

  2. OS 接收到请求,做好上下文切换的准备,并且 pend 一个 PendSV 异常。


  3. 当 CPU 退出 SVC 后,它立即进入 PendSV,从而执行上下文切换。


  4. 当 PendSV 执行完毕后,将返回到任务 B,同时进入线程模式。


  5. 发生了一个中断,并且中断服务程序开始执行

  6. 在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。


  7. OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。


  8. 当 SysTick 退出后,回到先前被抢占的 ISR 中,ISR 继续执行ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换

  9. 当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。


1.5 CM3中断处理特色——Tail-Chainign


两个同优先级中断交接时,不执行断点恢复和断点数据恢复,直接转到下一个中断执行。


2 中断与事件


2.1 事件、中断事件 中断


凡从事过ST MCU应用开发的人往往会遇到事件、中断事件 中断三个概念或术语。这三个概念彼此关联,有时会让人有点混淆或犯迷糊。 

先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一个STM32 GPIO外部中断配置案例。


比如一老师在教室里给学生们上课。课堂上的学生可能做出各种行为动作,比方做笔记、打哈气、翻书包、讲小话等,我们把这些行为统称为事件,其中有些行为老师往往只是视而不见,继续他的上课;而有些行为可能导致老师的上课中止,比方讲小话,并对学生的相关行为予以警告、批评或纠正等,然后继续上课。我们把老师因为学生的某些行为而中止授课,并产生后续动作,之后接着上课的这个过程理解为中断或中断响应。我们把可能导致老师上课中断的学生行为理解为中断事件。 

结合上面的比方,不难理解中断事件是一种可以导致中断发生的事件,中断则是因为中断事件的发生而导致的后续行为过程。事件与中断事件是包含关系,即事件可分为中断事件或非中断事件。而中断事件与中断之间属于前后关联的因果关系,虽有关联,但二者在时序上、行为上并不一样。 

结合具体的ST MCU运行过程,其中会有许多各种各样的事件,比方管脚电平变化、计数器溢出、DMA空、FIFO非空、AD转换结束、超时、外设使能、初始化等等,其中有些事件是不会导致中断产生的,比方外设使能或部分初始化动作是不会导致中断发生的,有些事件就可能导致中断发生,比方计数器溢出,AD转换结束等,这些就是中断事件。当然这些中断事件最终能否触发后续中断,得看是否开启了该中断事件的中断使能,相关中断矢量控制器【NVIC】是否配置,最终让CPU内核参与进来,并完成后续的中断服务动作。 

不妨借助STM32 MCU的GPIO的外部事件与中断控制器的框图来理解上述概念。 

这里写图片描述 

从上图可以看出,不论外部电平变化成为中断事件还是非中断事件,绿色方框部分都是一样的,即具有相同的触发源。差别就在后面。一般性事件要变为中断事件,得有相关中断使能位的允许。中断事件再向CPU激活相关中断请求,在NVIC配置相应中断矢量后,CPU便参与进行后续的中断响应服务【如保存现场、执行中断服务程序、恢复现场并返回】,而非中断事件就没有中断事件后续的流程,只是有些硬件触发信号或标志的产生。当然非中断事件的形成也是可控的。


既然一个可以触发中断的事件可能被配置中断事件或非中断事件,那么在相关事件的触发配置时就出现两种可能,即允许产生中断或禁止产生中断。于是乎,ST MCU参考手册里在谈到事件的触发方式时就引出了事件模式和中断模式两个概念。


比方STM32的GPIO口的电平跳变基本都是可以触发外部中断的。但在具体配置时,可以根据需要来决定启用还是禁用相关脚的中断功能,从而选择不同的事件触发方式,即事件模式和中断模式。如果不希望电平跳变事件触发中断,就配置为事件模式,反之,配置为中断模式。


在STM32相关参考手册里,涉及中断【INTERRUPT】和事件【EVENT】二词表述的地方比较多,加上这两个词的含义比较宽泛。手册里可能会用interrupt或interrupt event表述同一东西,或者说interrup泛指中断事件及后续中断响应全过程。比方类似下面语句的地方: 


这里写图片描述


有时用Interrupt event明确出来。比方下面表格中提到interrupt event. 


这里写图片描述

这里写图片描述 

总之,不管手册上怎么写,不必拘泥于字词符号,结合上下文弄清怎么回事就好。


2.2 外部中断线或外部事件线示例分析


这里写图片描述 

这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了. 

按下来是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为”1”时,不管外部信号如何,编号3的或门都会输出有效信号. 

一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化. 

外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为”0”,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽. 

明白了外部中断的请求机制,就很容易理解事件的请求机制了.图中红色虚线箭头,标出了外部事件信号的传输路径,外部请求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器的一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块.从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的.之所以分成2个部分,由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等; 

简单举例:外部I/O触发AD转换,来测量外部物品的重量;如果使用传统的中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务了。 

总结: 

可以这样简单的认为,事件机制提供了一个完全由硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法;


参考:


1、Cortex-M3权威指南(中文)


2 、STM32参考手册中文版(第10版)


3、http://blog.csdn.net/tanyjin/article/details/53359883


4、http://blog.csdn.net/u010315587/article/details/50086395



关键字:STM32  异常  中断  事件 引用地址:STM32的"异常“、“中断”和“事件”区别和理解

上一篇:STM32F030使用RTC周期性唤醒STOP模式
下一篇:ARM Cortex-M3中断跳转过程

推荐阅读最新更新时间:2024-03-16 16:19

MSP430与DS18B20数码管显示(中断法)
#include msp430x14x.h typedef unsigned char uchar; typedef unsigned int uint; /*****18B20部分的接口定义********/ #define DQ1 P1OUT |= BIT6 #define DQ0 P1OUT &= ~BIT6 #define DQ_in P1DIR &= ~BIT6 #define DQ_out P1DIR |= BIT6 #define DQ_val (P1IN & BIT6) /*****数码管部分的接口定义********/ #define wei_h P5OUT|= BIT5 #define wei_l P5OUT
[单片机]
stm32使用中出现的警告
使用keill编写了一个程序 如下: uint8_t Count_Init(uint16_t sing) { if(sing mode72) { return 72; }else if(sing mode60) { return 60; }else if(sing mode48) { return 48; } } 这样在编译的时候会出现这样的警告 :count.c(51): warning: #940-D: missing return statement at end of non-void funcTIon Count_Init 这个警
[单片机]
STM32的ADC用法你都知道吗?
AD采样在电路中是一种比较常见的功能,可以用于电池电压检测、传感器值读取、信号采集等。STM32的ADC,由于引入了DMA,以及多种触发源,功能自然强大,用法也多种多样。这里简单说下单通道情况下,AD采样的几种用法。 1、AD单次转换+软件启动 最基本的用法,通过程序启动AD,AD采集一次,我们就去读一次。这种情况,建议开启AD转换完成中断,在中断中读出AD值并做处理。 这种方式的优点是配置简单,缺点么,太T么简单~ 初始化的时候,启动一次。然后在主循环里,每隔一秒启动一次。 在中断回调函数里,进行相关处理: 电脑输出如下: 2、连续转换+软件启动 在方法1的基础上做调整,从单次转换,变成连续转换。也就是说,只需要
[单片机]
<font color='red'>STM32</font>的ADC用法你都知道吗?
STM32驱动多个超声波模块(只用一个定时器)
用STM32单片机成功驱动一个超声波模块后,接下来便有了疑问如何用stm32单片机驱动多个超声波模块呢?(驱动一个超声波模块可以参考:stm32驱动超声波模块测距) 超声波模块型号为HC-SR04,模块驱动方式选择利用外部中断的方式驱动(具体细节可参见上面链接)。 经过一个下午的思考实验发现了两种驱动多个超声波模块的方法: 分时测量 同时测量 1.分时测量: 通过类似于实现流水灯的方法,多个超声波模块依次测量并将测量结果依次输出。 优点:各个超声波模块测量过程中不会出现相互干扰的情况。 缺点:整体测量周期长,数据采样频率比较低。 这里有几个问题点需要注意: 一个超声波模块需要在测量完成后再开始下一个模块的测量 超声波模块在
[单片机]
STM32学习笔记之SPI_DMA寄存器级操作
一、实验目标 学会配置STM32的SPI寄存器和DMA寄存器,实现STM32的SPI1与SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。 二、实验目的 加入DMA的SPI通信相对于普通SPI通信有什么好处?ST给SPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题,一直边学习边想。以下是我的看法: 减少CPU负荷?我想这应该是DMA最主要的功能,可是对于SPI通信来说,其实大部分时候我们需要根据发送的指令- 目标器件的应答来决定下一个指令,所以此时CPU还是需要一直等待每次通信的结束。而且像SD卡的操作,是一个顺序流的指令操作过程,用中断也不容易控制。那到底加入了DMA有什么
[单片机]
<font color='red'>STM32</font>学习笔记之SPI_DMA寄存器级操作
对STM32F107中断向量优先级的理解
在网上看到了一个人对107中断向量优先级的理解,仔细读完觉得还可以,特分享,具体内容如下: 形象化的理解是: 你是上帝, 造了43个人,这么多人要分社会阶级和社会阶层了; 因为“阶级”的词性比较重; 阶层 比较中性, 所以preemption优先级- 阶级;每个阶级内部,有一些阶层,sub优先级- 阶层; 如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。 每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChan
[单片机]
keil环境下IAP使用中 stm32中M0 M3中断偏移对比
M3中断偏移: 当加入IAP 程序之后,程序运行流程如图所示:默认情况下,main flash memory(0x0800 0000) is selected boot space,即映射为 0x0000 0000。相当于从物理地址0x0800 0000启动程序。 00 在main函数的执行过程中如果出现中断请求,PC指针扔强制跳转到地址0x0800 0004的中断向量表处,而不是新程序的中断向量表,如图标号4所示。在通过VTOR的偏移地址再跳到新的偏移向量处(即APP的中断向量),执行APP的中断程序,如图标号5所示。中断程序执行完成后,返回main函数继续运行,如图标号6所示。 我们知道 IAP 程序必须满足两个要求:
[单片机]
基于MSP430、STM32的2.4G无线游戏遥控器实现
历时7天,跨度两个多星期,才将微型四轴的遥控器调试好,中间除了备考两科考试,其余时间全在宿舍蹭网消磨青春,不得不说状态不好,实际上内心也极度的空虚。 之前将微型四轴的机体做好,迫不及待的进行了一下测试,天真的以为,飞机不用遥控器也可以,实际上我设想的是直接用手头的开发板对其进行简单的增减速,为此我还 特意为它写了一个触摸控制界面,只有三个触控点,一个加速,一个减速,一个停止,非常无聊。 后来发现,没有一个遥控器真的非常不方便,周六便去二手市场仅用5元便淘得一飞机遥控器,里面电池都还没用完,质量算上乘。这遥控器是红外遥控的,用手机看了下红外管,能够正常发光实际上,我当然最希望直接对现有电路进行一下线路修改就实现最方便了,事情
[单片机]
基于MSP430、<font color='red'>STM32</font>的2.4G无线游戏遥控器实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved