FreeRTOS学习笔记——FreeRTOS中断管理

精华总结:

中断优先级0为最高,任务优先级0为最低

中断优先级分组中为方便rtos管理4bit全部设置成抢占优先级

32单片机的中断管理是由3个寄存器完成(名字忽略,具体功能忽略),三个寄存器都是32bit,通过移位可操作设置寄存器上的bit位,比如可设置pendsv中断和systick中断优先级

最终,pendsv与systick被设置成15,pendsv与systick切换任务的时候不会影响到其它中断的触发(比如外部中断)

上面三个寄存器是设置中断优先级;还有三个寄存器用于屏蔽中断,freertos使用了寄存器BASEPRI用于中断屏蔽,为0x50代表关闭(也可以说屏蔽)5-15优先级的中断,为0代表不关闭(屏蔽)任何中断(就是这个寄存器规定了freertos只能控制5-15优先级的中断),如果为0x60,则就是6-15

1、中断优先级分组全部设置成抢占优先级->是为了方便freertos管理中断

即:HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

2、你的中断优先级设置必须是5-15(当然也可以为0-4,但这样不受控了)

3、freertos只能控制5-15优先级的中断

4、0-4的中断因为rtos不可控,所以禁止0-4的中断调用rtos的api函数,因此设置抢占优先级必须≥5才行,如果你设置成了4则rtos控制不了则无法控制别人抢占你或者你抢占别人

什么是中断?

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

例:

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

中断优先级分组设置

ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级,这个寄存器就
是中断优先级配置寄存器,因此最大中断的优先级配置范围位 0~255。但是芯片厂商一般用不
完这些资源,对于 STM32,只用到了中断优先级配置寄存器的高 4 位[7:4],低四位[3:0]取零处
,因此 STM32 提供了最大 2^4=16 级的中断优先等级

中断优先级配置寄存器的值与对应的优先等级成反比,即中断优先级配置寄存器的值越小,
中断的优先等级越高

STM32 的中断优先级可以分为抢占优先级和子优先级,抢占优先级和子优先级的区别如下:

抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断,即中断嵌套。

子优先级: 抢占优先级相同时,子优先级高的中断不能打断正在执行但子优先级低的中的
中断
,即子优先级不支持中断嵌套。  

STM32 中每个中断的优先级就由抢占优先级和子优先级共同组成,使用中断优先级配置寄
存器的高 4 位来配置抢占优先级和子优先级,那么中断优先级配置寄存器的高 4 位是如何分配
设置抢占优先级和子优先级的呢?

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

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

老生常谈,FreeRTOS只用分组4,因为这样方便打断,不用考虑子优先级了

中断优先级0为最高,任务优先级0为最低

中断相关寄存器

三个系统中断优先级配置寄存器:

分别为 SHPR1、 SHPR2、 SHPR3

SHPR1寄存器地址:0xE000ED18

SHPR2寄存器地址:0xE000ED1C

SHPR3寄存器地址:0xE000ED20

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

1. SHPR1
SHPR1 寄存器的地址为 0xE000ED18, 用于配置 MemManage、 BusFault、 UsageFault 的中
断优先级, 各比特位的功能描述如下表所示:

2. SHPR2
SHPR2 寄存器的地址为 0xE000ED1C,用于配置 SVCall 的中断优先级, 各比特位的功能
描述如下表所示:

3. SHPR3
SHPR3 寄存器的地址为 0xE000ED20,用于配置 PendSV、 SysTick 的中断优先级, 各比特
位的功能描述如下表所示:

FreeRTOS 在配置 PendSV 和 SysTick 中断优先级的时,就使用到了 SHPR3 寄存器

FreeRTOS 如何配置 PendSV 和 SysTick 中断优先级:

PendSV和SysTick设置最低优先级

设置最低:保证系统任务切换不会阻塞系统其他中断的响应

三个中断屏蔽寄存器:

分别为 PRIMASK、 FAULTMASK 和BASEPRI

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

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

比如: BASEPRI设置为0x50,代表中断优先级在5~15内的均被屏蔽,0~4的中断优先级正常执行

建议参考知识库中:GPT对话知识库——FreeRTOS中寄存器BASEPRI的作用

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

关中断程序示例:

#define portDISABLE_INTERRUPTS()vPortRaiseBASEPRI()static portFORCE_INLINE void vPortRaiseBASEPRI( void ){uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;__asm{msr basepri, ulNewBASEPRIdsbisb}}#define configMAX_SYSCALL_INTERRUPT_PRIORITY( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY5/* FreeRTOS可管理的最高中断优先级 */

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

开中断程序示例:

#define portENABLE_INTERRUPTS()vPortSetBASEPRI( 0 )static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ){__asm{msr basepri, ulBASEPRI}}

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

当BASEPRI设置为0x50时:

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

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

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

参考链接:

https://blog.csdn.net/weixin_44639540/article/details/129007015

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/508349.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】手写 Promise(静态方法)

手写Promise-静态方法resolve 需求: 返回一个带有成功原因的Promise对象 HMPromise.resolve(new HMPromise((resolve, reject) > {// resolve(resolve)// reject(reject)// throw error })).then(res > {console.log(res:, res) }, err > {console.log(err:, err) …

Google Dremel和parquet的复杂嵌套数据结构表征方法解析

转载请注明出处。作者&#xff1a;archimekai 核心参考文献&#xff1a; Dremel: Interactive Analysis of Web-Scale Datasets 文章目录 引言复杂嵌套数据结构的无损表征问题Dremel论文中提出的表征方法parquet备注 引言 Dremel是Google的交互式分析系统。Google大量采用prot…

阅读笔记 | Transformers in Time Series: A Survey

阅读论文&#xff1a; Wen, Qingsong, et al. “Transformers in time series: A survey.” arXiv preprint arXiv:2202.07125 (2022). 这篇综述主要对基于Transformer的时序建模方法进行介绍。论文首先简单介绍了Transformer的基本原理&#xff0c;包括位置编码、多头注意力机…

01 MySQL之连接

1. 连接 1.0 基础认知 多表(主表)和一表(从表的区别): 多表一般是主表&#xff0c;一般存储主要数据&#xff0c;每个字段都可能存在重复值&#xff0c;没有主键&#xff0c;无法根据某个字段定位到准确的记录&#xff1b; 一表一般是从表&#xff0c;一般存储辅助数据&…

基础二分学习笔记

模板 : 个人倾向第一种 ; 整数二分 : 最大化查找 : 可行区域在左侧 : 查找最后一个<q的数的下标 : int find(int q){// 查找最后一个 < q 的下标 int l 0 , r n 1 ;while(l 1 < r){int mid l r >> 1 ;if(a[mid]<q) l mid ;else r mid ;}return…

如何限制一个账号只在一处登陆

大家好&#xff0c;我是广漂程序员DevinRock&#xff01; 1. 需求分析 前阵子&#xff0c;和问答群里一个前端朋友&#xff0c;随便唠了唠。期间他问了我一个问题&#xff0c;让我印象深刻。 他问的是&#xff0c;限制同一账号只能在一处设备上登录&#xff0c;是如何实现的…

第二篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas金融数据分析

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas 在金融数据分析中的常见用途和功能介绍二、金融数据清洗和准备示例代码三、金融数据索引和选择示例代码四、金融数据时间序列分析示例代码五、金融数据可视化示例代码六、金融数…

CUDA 中的线程组织

明朝那些事中有一句话&#xff1a;我之所以写徐霞客是想告诉你&#xff0c;所谓千秋霸业万古流芳&#xff0c;与一件事相比&#xff0c;其实都算不了什么&#xff0c;这件事情就是——用你喜欢的方式度过一生。 我们以最简单的 CUDA 程序&#xff1a;从 GPU 中输出 Hello World…

C++基于多设计模式下的同步异步日志系统day4

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C基于多设计模式下的同步&异步日志系统 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 只要内容主要实现了同步日志消息…

Unreal触屏和鼠标控制旋转冲突问题

Unreal触屏和鼠标控制旋转冲突问题 鼠标控制摄像机旋转添加Input轴计算旋转角度通过轴事件控制旋转 问题和原因问题原因 解决办法增加触摸控制旋转代码触屏操作下屏蔽鼠标轴响应事件 鼠标控制摄像机旋转 通过Mouse X和Mouse Y控制摄像机旋转。 添加Input轴 计算旋转角度 通过…

外贸网站模板建站

测绘检测wordpress外贸主题 简洁实用的wordpress外贸主题&#xff0c;适合做测绘检测仪器设备的外贸公司使用。 https://www.jianzhanpress.com/?p5337 白马非马衣服WordPress外贸建站模板 白马非马服装行业wordpress外贸建站模板&#xff0c;适用于时间服装企业的官方网站…

利用redis实现秒杀功能

6、秒杀优化 这个是 图灵 的redis实战里面的一个案例 6.1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤…