中断机制详解:让你一文搞定
1. 中断概念
中断是处理器中的一种机制,用于响应和处理突发事件或紧急事件。当发生中断时,当前正在执行的程序会被暂时中止,处理器会跳转到中断处理程序对中断事件进行处理。处理完中断后,处理器再返回到被中断的程序继续执行。
中断可以分为内部中断和外部中断:
1. 内部中断:由处理器内部的模块或事件引发,例如定时器溢出、串口接收缓冲区非空 等。内部中断可以用于定期执行特定任务、检测状态变化等。
2. 外部中断:由外部设备或外部信号引发,例如按键按下、外部传感器信号变化等。外部中断用于响应外部事件,并及时处理相关任务。
中断又可以分为可屏蔽中断和不可屏蔽中断:
1. 可由程序控制其屏蔽的中断称为可屏蔽中断。
2. 不能由程序控制其屏蔽,处理机一定要立即处理的中断称为非屏蔽中断或不可屏蔽中断。不可屏蔽中断主要用于断电、电源故障等必须立即处理的情况,我们一般使用的是不可屏蔽的中断。
基本概念
- 中断向量表:中断向量表是存储中断处理程序地址的表格,当中断发生时微控制器会根据中断向量表中相应中断的地址跳转到对应的中断处理函数。
- 中断请求:称为中断源或中断事件、是指外部设备或内部模块发出的信号,通知微控制器发生了一个特定的事件。
- 中断控制器:中断控制器负责对中断请求进行管理和分配优先级,如NVIC。
- 中断优先级:每个中断都具有一个优先级,用于确定中断处理程序的执行顺序。较高优先级的中断会打断正在执行的较低优先级中断或主程序。
- 中断处理程序:中断服务函数,是一段用于处理特定中断的代码。当中断发生时,微控制器会跳转到相应的中断处理程序执行相关操作,处理完毕后返回主程序。
- 中断使能:通过设置相应的中断使能位,可以启用或禁用特定的中断。禁用中断后,即使中断请求发生,微控制器也不会响应。
- 中断标志:中断标志用于指示特定中断是否已经发生。在处理完中断后,需要清除相应的中断标志,以便再次触发相同中断。
2 中断优先级
在Cortex-M3(CM3)内核中,每个中断的优先级都是用寄存器中的8位来设置的,这样就有2^8 =256级中断,意味着可以支持256个中断,这其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但许多芯片厂商并没有使用CM3内核的全部东西,而是只用了它的一部分,而多余的部分应该是设计者考虑到后续应用发展而冗余设计的。
STM32F1只用了 NVIC->IPR 的高四位,[7:4]低四位取零,这样2^4=16,只能表示16级中断嵌套。
3. 中断向量表
中断向量表(Interrupt Vector Table)是存储中断处理程序地址的表格。它是一个特定的数据结构,用于将每个中断事件映射到相应的中断处理程序。
灰色标住的是体现在内核水平的(异常),其余的是外设水平的(外部中断)。系统异常有 8 个(如果把 Reset 和 HardFault 也算上的话就是 10 个),外部中断有 60 个。
4. NVIC
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。
分组方式 | 抢占优先级 | 响应优先级 |
---|---|---|
分组0 | 0位,取值为0 | 4位,取值为0~15 |
分组1 | 1位,取值为0~1 | 3位,取值为0~7 |
分组2 | 2位,取值为0~3 | 2位,取值为0~3 |
分组3 | 3位,取值为0~7 | 1位,取值为0~1 |
分组4 | 4位, 取值为0~15 | 0位,取值为0 |
抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队,中断号是中断服务函数所处在中断向量表的位置,越小位置越前。
无论是抢占优先级(主优先级)还是响应优先级(子优先级),优先级数值越小,就代表优先级越高。
5. 中断编程
1. 使能外设某个中断
2. 初始化NVIC_InitTypeDef结构体
3. 编写中断服务函数
typedef struct
{
uint8_t NVIC_IRQChannel; // 中断源
uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级
uint8_t NVIC_IRQChannelSubPriority; // 子优先级
FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能
} NVIC_InitTypeDef;
初始化流程:
NVIC_InitTypeDef NVIC_InitStructure;
// 1.选择优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// 2.选择需要产生中断的外设
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
// 3.设置抢占优先级级别
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
// 4.设置响应优先级级别
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
// 5.使能中断
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// 6.初始化中断
NVIC_Init(&NVIC_InitStructure);
注:中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。
6. EXIT
EXIT(External interrupt/event controller)外部中断/事件控制器,管理了控制器的 20 个中断/事件线。
每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。
STM32供IO口使用的中断线只有16个,但是STM32的IO口却远远不止16个。
EXIT基本结构
AFIO中断引脚选择:是一个中断引脚选择器可以在前面GPIO外设的16个引脚中选择一个连接到EXTI边沿检测及控制中所以。
相同的Pin不能同时触发中断,因为PA0,PB0,PC0通过AFIO选择后只有其中一个可以连接到EXTI的通道0上,PB1,PC1等也只有一个可以接入EXTI上。
AFIO的主要作用:用于引脚复用功能的选择和重定义,在STM32中主要完成复用功能引脚重映射和中断引脚选择。
面试常见问题
1. 中断和异常有何区别?
中断和异常都是CP对系统发生的某个事件做出的一种反应,但中断是由外因引起,异常是由CPU本身引起。
引起中断和异常的理由。
2. 中断和DMA有什么区别?
中段传输方式是在数据缓冲区满后发生中断请求,CPU进行中断处理将数据传输到内存,而DMA方式则是以数据块为单位传输的,在所要求传送的数据块全部传送结束时要求CPU进行中断处理。DMA运输的大部分时间,CPU和输入输出都处于并行操作,因此,整个计算机系统的效率大大提高,但DMA也是要利用中断的,否则CPU无法获知数据已经传输结束。
3. 中断和轮询的区别是什么?
中断是由硬件来判断是否发生外部事件并通知CPU,然后采用专用的中断服务程序来处理事件。轮询是周期/连续的检查外部事件是否发生,需要消耗大量CPU的处理时间。
中断:适用处理对响应要求非常高的事件或处理持续事件非常短的事件,程序设计较复杂。
轮询:适于处理对时间响应要求低的场合,程序设计较为简单。
4. 嵌入式系统中的中断优先级如何确定?
设置中断优先级首先要考虑的是安全和稳定性,如果有一个中断与硬件故障或安全问题相关,那么这个中断通常被赋予较高的优先级。其次考虑的是实时性要求,对于那些有严格实时性要求的任务,中断优先级相对来说会较高。中断处理时间,长中断服务例程(ISR)可能会阻塞其他中断的执行,因此,较长的ISR可以被赋予较低的优先级,以减少对系统性能的影响。初步设计完后需要通过测试和验证来确保系统的稳定性和性能满足要求。
5. 嵌入式系统的外部中断?
外部中断是指由外部事件触发的中断,通常是通过外部引脚上的信号来触发,这个触发条件可以是多种类型,包括上升沿,下降沿,边沿触发等。当外部中断产生时,触发信号会被外部中断控制器(EXIT)所接收和处理并转发到处理器核心的中断控制器(NVIC)中,NVIC会根据预设的优先级规则对收到的中断请求进行排序,在保护好现场后,程序会跳转执行优先级较高的中断服务程序,程序运行完后会清除中断并恢复现场最后返回到主程序运行。
6. 中断开始前要进行些什么操作?
7. STM32是如何处理中断的
中断服务函数:相对于正常子函数,中断服务函数有以下需要注意的地方:
1、中断服务函数不能传入参数;
2、中断服务函数不能有返回值;
3、中断服务函数应该做到短小精悍,快入快出,禁止延时性的过程。
4、不要在中断函数中使用printf函数,会带来重入和性能问题,不要出现浮点运算。
8. STM32 是谁收到中断
外部中断是由外部中断控制器(EXIT和NVIC)接收和处理的,异常时处理器中的异常处理单元来检测和响应程序执行过程中的异常情况的。
9 中断处理流程
10. 谁执行中断服务函数
CPU
11. 如果中断的响应优先级和抢占优先级都一样呢?谁先发生?
根据ARM Cotex-M处理器的规范,中断请求的处理顺序将由唯一的硬件优先级标识符决定,即中断向量表中的位置,位置越前的中断请求优先被处理。
12. 除了中断的响应优先级、抢占优先级、中断号,还有那些影响中断响应的因素呢?
中断处理函数的执行时间:如果执行时间很长,其他中断的请求有可能就被挂起,只有当前的中断处理函数执行完成,其他中断继续执行
中断屏蔽:前面简单介绍了几种中断,我们知道中断屏蔽某位置1,该中断就不能发生,即使优先级高也无法执行。
13. 中断触发的原因只有中断产生了中断请求这一种情况吗?
通常情况下是这样,那不通常呢?具体要取决于处理器的架构和中断控制器的功能。有以下触发原因:
1.软件触发中断:有些处理器允许软件生成中断请求信号,触发中断。
2.异常或错误中断:处理器发生异常、错误、故障的情况下,可能触发响应的中断。
3.调试中断:程序在debug调试的时候暂停,跳转,会响应中断。
14. 那么调试中断响应的是哪些中断?
1.调试监听中断
2.断点
3.数据观察暂停
链接:
https://www.cnblogs.com/talenth/p/14059862.html
STM32学习笔记(二)——STM32的GPIO和AFIO_stm32的afio-CSDN博客
(七)STM32 NVIC 中断、优先级管理及 AFIO 时钟的开启_stm32中断控制器-CSDN博客
作者:炒 蛋