FreeRTOS——中断管理

news/2024/10/17 11:39:08/

中断理论剖析

中断简介

中断是一种机制,用于处理高优先级的事件或故障。当一个中断事件发生时,单片机可以立即中断正在执行的程序,转而处理中断事件。这种机制可以提高系统的响应速度和实时性。

中断优先级分组设置

ARM Cortex-M使用了8位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器,也就是二的八次方,0~255的等级。但STM32,只用了中断优先级配置寄存器的高4位【7:4】,所以STM32提供了最大16级的中断有限等级

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

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

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

(中断优先级数值越小,优先级越高)

中断优先级分组设置

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

优先级分组抢占优先级子优先级优先级配置寄存器高4位
NVIC_PriorityGroup_00级抢占优先级0-15级子优先级

0bit用于抢占优先级

4bit用于子优先级

NVIC_PriorityGroup_10-1级抢占优先级0-7级子优先级

1bit用于抢占优先级

3bit用于子优先级

NVIC_PriorityGroup_20-3级抢占优先级0-3级子优先级

2bit用于抢占优先级

2bit用于子优先级

NVIC_PriorityGroup_30-7级抢占优先级0-1级子优先级

3bit用于抢占优先级

1bit用于子优先级

NVIC_PriorityGroup_40-15级抢占优先级0级子优先级

4bit用于抢占优先级

0bit用于子优先级

FreeRTOS为了方便管理,使用了NVIC_PriorityGroup_4,寄存器高4位都用于抢占优先级。

通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PriorityGroup_4),即可完成设置优先级分组。

特点:

1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY【5】优先级的中断里才允许调用FreeRTOS的API函数,也就是中断优先级需要在5~15之间才可以调用系统的API函数。

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

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

中断相关寄存器

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

其中PendSV和SysTick的优先级是需要特别注意的,PendSV实现任务切换和任务调度等操作,SysTick提供系统节拍(心跳)

一个中断优先级配置寄存器由32位组成。

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

所以PendSV和SysTick设置为最低中断优先级

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

中断相关寄存器

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

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

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

如:BASEPRI设置为0x50(只利用了中断优先级配置寄存器的高4位),代表中断优先级在5~15内的均被屏蔽,0~4的中断优先级正常运行。

关中断程序解析

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

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

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

开中断程序解析

中断管理实验

实验通过使用两个定时器,一个优先级为4,一个优先级为6,注意:系统所管理的优先级范围:5~15

现象:两个定时器每1s,打印一段字符串,优先级为6的中断当关中断时,停止打印,开中断时持续打印。

中断服务函数: 

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断{printf("TIM3输出.......\r\n");}TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}//定时器5中断服务函数
void TIM5_IRQHandler(void)
{if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) //溢出中断{printf("TIM5输出.......\r\n");}TIM_ClearITPendingBit(TIM5,TIM_IT_Update);  //清除中断标志位

创建start任务,在start任务中创建task1任务,创建完之后start任务自杀。 

 

为什么if语句里面用delay_ms不用vTaskDelay()?
这是由于我们的vTaskDelay()里面的一些函数使用了退出临界区函数,而退出临界区也有调用portENABLE——INTERRUPTS(),跳转如下:

 

 

 


http://www.ppmy.cn/news/1539695.html

相关文章

Lumerical学习——资源管理和运行模拟

一、资源管理(Resource Manager) 在模拟计算前必须对计算资源进行配置。采用资源管理器可以完成这项任务。单击主工具条的“资源(Resources)”按钮(见上图)就可以打开资源管理器。通常每个计算机只需设置一…

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中,存储过程是一种预先编写好的SQL代码集合,它被保存在数据库服务器上,可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句,如IF条件语句、WHILE循环等,使…

LeetCode Hot100 | Day5 | 二叉树右视图二叉树展开为链表

LeetCode Hot100 | Day5 | 二叉树右视图&&二叉树展开为链表 文章目录 LeetCode Hot100 | Day5 | 二叉树右视图&&二叉树展开为链表199.二叉树的右视图1.递归遍历2.层序遍历 114.二叉树展开为链表 199.二叉树的右视图 199. 二叉树的右视图 - 力扣(Le…

400行程序写一个实时操作系统(九):替换FreeRTOS的内存管理算法

前言 通过前面几章,笔者带领大家完成了内存管理算法的编写。 我们完成的内存管理算法,被称为小内存管理算法。我们也可以将它作为一个库,在后续的嵌入式开发中,使用我们自己编写的malloc,不仅效率会更高,…

目标检测系统中需要【重新训练模型】说明

上百种【基于YOLOv8/v10/v11的目标检测系统】目录(pythonpyside6界面系统源码可训练的数据集也完成的训练模型)-CSDN博客 目标检测系统操作说明【用户使用指南】(pythonpyside6界面系统源码可训练的数据集也完成的训练模型)-CSDN…

上海亚商投顾:沪指冲高回落 成渝板块近50股涨停

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天震荡分化,三大指数涨跌不一。成渝本地股集体爆发,成都路桥、重庆建工、四川金…

R语言绘制聚类热图

聚类热图是一种直观的数据可视化工具。它以矩形彩色图表的形式呈现数据矩阵,每个单元格颜色对应特定数值,通常从低值的冷色调到高值的暖色调渐变。常应用于多个领域,如生物学中分析基因表达、蛋白质相互作用和生物群落;金融领域用…

易基因:DNA甲基化+转录组综合分析鉴定调控猪睾丸发育的潜在基因|附经典研究思路

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 DNA甲基化在调控基因表达和睾丸发育中发挥重要作用。WGBS 和 RNA-Seq 数据综合分析可以绘制DNA甲基化与基因表达关系的全面图谱,从而鉴定受甲基化影响的关键基因。如对小鼠睾…