STM32中异常、中断、事件辨析

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

1 异常与中断(Cortex-M3)


1.1 异常与中断


原话: 


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


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


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


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


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


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


异常表: 

异常表

外部中断表: 

外部中断表


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


1.2 优先级


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


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


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


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


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


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


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


优先级组


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


1.3 中断与悬起(挂起)


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


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


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


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


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


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


这里写图片描述


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


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


这里写图片描述


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


中断悬起


1.4 SVC和PendSV


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


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


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


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


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


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


简单的调度方式: 


1. 时间轮转(SysTick) 


这里写图片描述


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


这里写图片描述


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


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


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


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


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


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


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


当 SysTick 退出后,回到先前被抢占的 ISR 中,ISR 继续执行


ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换


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


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


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


2 中断与事件(未完)


这里写图片描述


图中: 


中断/事件首先经过边沿检测,确认有中断/事件请求发生,与软件中断/事件寄存器相“或”,由请求挂起寄存器记录当前有中断/事件请求发生,之后出现分支:

 

1. 中断:与中断屏蔽寄存器相“与”,转到NVIC控制器,由其控制。 


2. 事件:与事件屏蔽寄存器相“与”,产生脉冲。

关键字:STM32  异常  中断  事件 引用地址:STM32中异常、中断、事件辨析

上一篇:stm32 中断号和中断处理函数建立关系
下一篇:STM32之外部中断原理

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

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无线游戏遥控器实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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