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

2023-05-16

1 异常与中断(Cortex-M3)

1.1 异常与中断

原话: 
Cortex‐M3 在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。 
其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。 
除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。 
所有能打断正常执行流的事件都称为异常

  1. 异常的概念包含中断的概念,即中断是异常的子集
  2. 异常与中断都是硬件支持的。

异常表: 
异常表

外部中断表: 
外部中断表
这里的“外部中断”不是指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. 中断响应完成之后,中断请求仍然存在,则再次悬起,等待响应。 
    中断悬起

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 继续执行
  9. ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换
  10. 当 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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • C#学习记录——统一窗体中控件的字体设置

    实例说明 当窗体上有很多控件时 xff0c 如果逐个设置字体属性 xff0c 会非常繁琐 xff0c 这时 xff0c 可以将字体属性设置一致的控件选中进行统一设置 xff0c 这样可以大大节省开发程序的时间 实例运行效果如图1所示 设计过
  • C#学习记录——Visual Studio为项目添加DLL文件引用

    实例说明 DLL文件引用就是在当前项目中引用别的DLL文件 xff0c 可以是用C 编写的类库 xff0c 也可以是别的语言编写的类库 xff0c 这样主要是为了提高程序的开发效率 xff0c 将DLL文件中的一些已有功能直接进行使用 xf
  • C#学习记录——C#编写串口程序

    因为电气自动化专业出差太多 xff0c 考虑学点其他的看能不能实现转行 xff0c 也没太清晰的路线 xff0c 看网上好多推荐电气自动化转C 上位机开发的 xff0c 也抽时间学习了解下C xff0c 因为非软件专业 xff0c 对计算机
  • C#项目实战——【实战】图书馆管理系统

    参考 零基础学C 3 0 学习实现 本篇练习记录一个开发图书馆管理系统示例 1 实现功能简介 图书管理系统利用VS2019集成开发环境进行程序的编程和调试 数据库采用SQL Server 2008 图书管理系统框图如图 普通用户模块具有以下
  • C#项目实战——Windows计算器的制作【实例】

    参考 C 从入门到项目实践 边学习 边练习实现 Windows计算器的制作 此次练习的计算器应用软件在Visual Studio 2019编程环境中开发 是一个简单的窗体应用程序 实现简单的计算器功能 1 系统功能描述 Windows计算器
  • 【触摸屏功能测试】昆仑通态MCGS——物联网功能测试

    测试触摸屏 xff1a 型号 xff1a TPC7022Ni 测试内容 xff1a 物联网产品设备的无线通信和远程调试功能 物联网 1 功能概述 物联网产品设备可通过无线通讯的方式 xff0c 进行远程调试和操作 物联网产品设备支持以下功能
  • 【KingSCADA】如何建立硬件系统及相关变量

    小伙伴们大家好 xff0c 我是雷工 xff01 本篇学习了解KingSCADA3 8如何建立硬件系统及相关变量 xff0c 以下为学习过程和操作记录 一 前言 本篇主要讲解如何定义设备 xff0c 如何定义变量 KingSCADA3 8的
  • 解决Exception: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 等一系列问题

    一 xff0e 简介 Windows下的 Eclipse上调试Hadoop2代码 xff0c 所以我们在windows下的Eclipse配置hadoop eclipse plugin 2 6 0 jar插件 xff0c 并在运行Hadoop
  • July 16th 模拟赛C T4 奶牛排队 Solution

    空降题目处 点我点我点我 Description 奶牛在熊大妈的带领下排成了一条直队 显然 xff0c 不同的奶牛身高不一定相同 现在 xff0c 奶牛们想知道 xff0c 如果找出一些连续的奶牛 xff0c 要求最左边的奶牛A是最矮的 x
  • AI 工具合辑盘点(十三)持续更新 之 面向宠物爱好者的 AI 工具和面向电影爱好者的 AI 工具

    亲爱的宠物爱好者 xff0c 这个部分是专门为你准备的 x1f43e 不论你是爱狗人士还是铲屎官 xff0c AI 都能满足你 访问地址 xff1a This Cat Does Not Exist 猫咪生成器 你知道喜欢猫的爱好有个专门的名
  • 【KingSCADA】什么是精灵图以及如何创建精灵图

    大家好 xff0c 我是雷工 xff01 本篇学习精灵图的制作 xff0c 以下为学习内容及相关笔记 一 什么是精灵图 精灵图是一种在外观上类似组合图 xff0c 但内部嵌入了比较丰富的动画链接与逻辑控制 xff0c 工程开发人员只要将其从
  • 【数据库】SQL Server2022安装教程

    大家好 xff0c 我是雷工 xff01 最近需要安装SQLServer数据库 xff0c 此次安装的是sql server 2022 developer版本 xff0c 以下记录安装及配置过程 大家可以参考指正 一 安装SQL Serve
  • 网络ip段计算,网络地址计算,广播地址计算,主机号计算规则

    ip网段格式 一个ip段的范围通常是从网络地址 广播地址 xff0c 一般去除网络地址和广播地址后的范围就是一个可用的ip段 xff0c 也就是网络地址 43 1 至 广播地址 1 怎么计算ip的网络地址 xff1f 计算规则 使用ip的二
  • Windows使用Media Foundation采集摄像头数据

    文章目录 前言一 头文件二 MF对象三 示例总结 前言 在Windows上采集摄像头的数据的方法有几种 xff0c vfw directshow mf vfw过于老旧 xff0c directshow使用比较复杂 xff0c mf就是今天要
  • 第一篇:践履实录2006-2013

    2006年研究生毕业 xff0c 应聘到一家创办一年半左右的IC Startup公司从事Windows驱动软件的开发工作 xff0e 我们驱动组 xff08 我和我的师傅两个人 xff09 所面对的是一个全新项目 xff0c Microso
  • 51单片机DHT11温湿度传感器

    DHT11是一款有已校准数字信号输出的温湿度传感器 精度湿度 43 5 RH xff0c 温度 43 2 xff0c 量程湿度20 90 RH xff0c 温度0 50 一 电路连接分析 1 引脚图 2 接线图 DHT11 器件采用简化的单
  • 使用pytorch分布式进行训练的时候发生的错误

    在进行分布式训练的时候遇到这个错 xff0c 不知道怎么解决 xff0c 先记录一下 Traceback span class token punctuation span most recent call last span class
  • Linux驱动开发基础_在设备树中指定中断以及在代码中获得中断

    目录 1 设备树里中断节点的语法 1 1 设备树里的中断控制器 1 2 设备树里使用中断 2 设备树里中断节点的示例 3 在代码中获得中断 3 1 对于 platform device 3 2 对于 I2C 设备 SPI 设备 3 3 调用
  • Linux驱动开发基础__休眠与唤醒

    目录 1 适用场景 2 内核函数 2 1 休眠函数 2 2 唤醒函数 3 驱动框架 4 编程 4 1 gpio key drv c 4 2 button test c 4 3 Makefile 1 适用场景 在前面引入中断时 xff0c 我
  • Hive ddl语法使用详解

    一 前言 使用过关系型数据库mysql的同学对mysql的ddl语法应该不陌生 xff0c 使用ddl语言来创建数据库中的表 索引 视图 存储过程 触发器等 xff0c hive中也提供了类似ddl的语法 本篇将详细讲述hive中ddl的使

随机推荐