FreeRTOS学习 --- 中断管理

什么是中断?

让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断

中断执行机制,可简单概括为三步:

1,中断请求

外设产生中断请求(GPIO外部中断、定时器中断等)

2,响应中断

CPU停止执行当前程序,转而去执行中断处理程序(ISR)

3,退出中断

执行完毕,返回被打断的程序处,继续往下执行

STM32中断是怎么进入到中断服务程序的?

**1.中断请求:**当外部事件(如外部中断,定时器溢出等)或者内部事件(如ADC转换完成、串口接收完成等)发生时,相应的中断源会向NVIC(嵌套向量中断控制器)发生一个中断请求。

**2.中断优先级判断:**NVIC会根据中断的优先级来判断是否应该处理该中断。如果当前活动的中断优先级低于新请求的中断,则进行中断嵌套,处理更高优先级的中断。

**3.保存上下文:**当CPU接收中断并准备跳转到中断程序时,它会自动将当前的程序状态保存到栈中。这是为了在处理完中断后能够恢复中断前的状态继续执行。

**4.跳转到中断向量:**CPU通过查找中断向量表来确定中断的服务程序入口地址。STM32的中断向量表位于FLASH的开始部分,每个中断都有一个固定的向量地址。

**5.执行中断服务程序:**一旦确定了入口地址,CPU就会跳转到该地址并开始执行中断服务程序。在中断服务程序中,通常需要先清除中断标志,然后执行响应的处理代码。

**6.恢复上下文:**中断服务程序执行完成后,CPU会从栈中恢复之前保存的程序状态。

**7.返回主程序:**恢复上下文后,程序会从原来被中断的地方继续执行。

中断优先级分组设置

ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器。也就是有256个优先级

但STM32,只用了中断优先级配置寄存器的高4位 [7 : 4],所以STM32提供了最大16****级的中断优先等级

STM32 的中断优先级可以分为抢占优先级和子优先级

抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断

子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行

注意:中断优先级数值越小越优先

一共有 5 种分配方式,对应着中断优先级分组的 5 个组

通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置

(在HAL_Init中设置)

FreeRTOS官网关于中断说明:https://www.freertos.org/RTOS-Cortex-M3-M4.html

特点:

1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数

2、建议将所有优先级位指定为抢占优先级位,方便FreeRTOS管理

(调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)

3、中断优先级数值越小越优先,任务优先级数值越大越优先

中断相关寄存器

三个系统中断优先级配置寄存器,分别为 SHPR1、 SHPR2、 SHPR3

SHPR1寄存器地址:0xE000ED18

SHPR2寄存器地址:0xE000ED1C

SHPR3寄存器地址:0xE000ED20

表出自:《Cortex M3权威指南(中文)》第286页

FreeRTOS如何配置PendSVSystick****中断优先级?

中断相关寄存器

三个中断屏蔽寄存器,分别为 PRIMASK、 FAULTMASK 和BASEPRI

FreeRTOS所使用的中断管理就是利用的BASEPRI这个寄存器

**BASEPRI:**屏蔽优先级低于某一个阈值的中断

比如: BASEPRI设置为0x50,代表中断优先级在5~15内的均被屏蔽,0~4的中断优先级正常执行(0x50表示的是优先级小于等于5的中断被屏蔽,至于为什么是0x50,这个0是低四位在STM32中不用来设置中断优先级,STM32只用高四位[7:4]来设置中断优先级)

BASEPRI**:**屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断

关中断程序示例:

中断优先级在5 ~ 15的全部被关闭

当BASEPRI设置为0x50时:

在中断服务函数中调度FreeRTOS的API函数需注意:

1、中断服务函数的优先级需在FreeRTOS所管理的范围内

2、在中断服务函数里边需调用FreeRTOS的API函数,必须使用带"FromISR"后缀的函数

开中断程序示例:

FreeRTOS中断管理就是利用BASEPRI寄存器实现的

相关推荐
952368 分钟前
数据结构—单链表
c语言·数据结构·学习
我命由我1234512 分钟前
Git 暂存文件警告信息:warning: LF will be replaced by CRLF in XXX.java.
java·linux·笔记·git·后端·学习·java-ee
lingggggaaaa32 分钟前
小迪安全v2023学习笔记(九十五讲)—— 云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载
笔记·学习·安全·web安全·网络安全·docker·云原生
Yupureki1 小时前
从零开始的C++学习生活 2:类和对象(上)
c语言·开发语言·c++·学习·visual studio
charlie1145141911 小时前
从《Life of A Pixel》来看Chrome的渲染机制
前端·chrome·学习·渲染·浏览器·原理分析
来不及辣哎呀1 小时前
学习Java第三十天——黑马点评37~42
java·开发语言·学习
charlie1145141914 小时前
理解C++20的革命特性——协程支持1
c++·学习·c++20·协程·语言特性·调度·现代c++
The_Killer.4 小时前
近世代数(抽象代数)详细笔记--群
学习·抽象代数·
阿明64 小时前
list模拟实现(简单版)【C++】
开发语言·c++·学习·list
Yupureki4 小时前
从零开始的C++学习生活 1:命名空间,缺省函数,函数重载,引用,内联函数
c语言·开发语言·c++·学习·visual studio