FreeRTOS——中断管理

中断理论剖析

中断简介

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

中断优先级分组设置

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.mzph.cn/web/55334.shtml

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

相关文章

代码随想录算法训练营第46天|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II

文章目录 739. 每日温度496.下一个更大元素 I503.下一个更大元素II 单调栈,应用场景:找比当前元素大(小?),注意存放的是下标。 739. 每日温度 leetcode 739. 每日温度 代码随想录 class Solution:def dai…

Wed前端入门——HTML、CSS

Wed前端入门——HTML、CSS 一般的页面有HTML、CSS以及JavaScript组成 HTML定义了页面的结构和内容&#xff0c;包括文本、图像、链接等等CSS用于定义页面的布局和样式JS用于添加交互性和动态功能作用 一、HTML 基本格式&#xff1a; <!-- 文档类型为HTML --> <!D…

探索全球创新,我们的网址引领您进入专利检索新纪元

在知识经济时代&#xff0c;知识产权已成为企业竞争力的核心。我们的网址&#xff0c;作为一个集合知识产权、商标、软件著作权的综合性平台&#xff0c;特别推出了免费制的专利检索服务&#xff0c;旨在帮助用户轻松探索全球的专利宝藏。 全球专利&#xff0c;一网打尽 我们的…

【C++笔试强训】如何成为算法糕手Day9

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 添加逗号 思路&#xff1a; 代码实现&#xff1a; 跳台阶 思路&#xff1a; 代码实现&#xff1a; 扑克牌顺子 思路&#xf…

git clone --single-branch 提升效率

git clone --single-branch 是一个Git命令&#xff0c;用于从远程仓库中仅克隆单个分支到本地仓库。这个命令在软件开发中非常有用&#xff0c;尤其是在需要特定分支的代码而无需整个仓库的情况下。 基本用法 git clone --single-branch 命令的基本语法如下&#xff1a; git…

收藏!时间序列特征提取最全总结

时间序列数据在很多领域都是重要的结构化数据形式&#xff0c;例如金融、经济、生态学、神经科学和物理学。在多个时间点观测或测量的数据形成了时间序列。许多时间序列是固定频率的&#xff0c;也就是说数据是根据相同的规则定期出现的&#xff0c;例如每15秒、每5分钟或每月1…

骨架侧事件的概念和使用方法总结

一、事件包装类与Send()方法 在骨架侧&#xff0c;服务实现负责通知事件发生。以BrakeEvent事件包装类为例&#xff0c;其提供了Send()方法的两个变体用于发送事件数据&#xff1a; 第一个变体接受SampleType&#xff08;通常为事件数据类型&#xff09;的引用。事件数据由服…

高级IO——五种IO模型

一般我们在写一些简单的小项目的时候&#xff0c;免不了会用到IO接口&#xff0c;比如C语言中的scanf/printf又或者是 C中的cout/cin&#xff0c;或者是在Linux操作系统中的文件IO接口read/write。这些接口默认都是阻塞的&#xff0c; 这又引出了阻塞/非阻塞IO的概念&#xff0…

白平衡之White Patch Algorithm

免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。 读者在使用本文信息时,应…

Lobby——网络游戏大厅设计与参考建议!!!

随着网络游戏越来越多&#xff0c;游戏的主界面也是做的越来越花哨&#xff0c;各种界面层出不穷&#xff01;恨不得&#xff0c;一个主界面直接把所有的业务塞满&#xff01;&#xff01; 看着这十年不换的界面&#xff0c;经久不换&#xff0c;如同嚼蜡&#xff01;你会发现x…

GPU编程(1)GPU架构

总体 显卡结构 风扇在下面&#xff0c;采用热管方式&#xff0c;用气体液体的转化来带走热量。包裹热管的是铜制散热板&#xff0c;外围是铝制格扇&#xff0c;更快排除热量。 视频接口个pcie都是直接连接GPU。 所有的供电模块公用一个PWM芯片。 显存的型号就称之为显存颗粒…

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产&#xff0c;企业管理员必须建立高效的企业终端安全管控机制&#xff0c;确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统&#xff0c;确保任何未经授权的资产变动都能被迅…

Git推送被拒

今天开发完成一个新的需求&#xff0c;将自己的分支合并到test分支后&#xff0c;推送到远程仓库&#xff0c;结果显示推送被拒&#xff1a; 原因是因为有人更新了test分支的代码&#xff0c;我在合并之前没有拉取最新的test分支代码&#xff0c;所以他提示我“推送前需要合并…

企业级业务架构和IT架构规划方案(120页PPT下载)

方案内容综述 方案涵盖了从战略分析到具体实施路径的内容。提出了IT架构规划的工作思路&#xff0c;包括项目启动、部门访谈、资料收集、内部数据库搜索与先进实践研究等步骤&#xff0c;旨在通过这些步骤完成现状及差距分析&#xff0c;并基于此设计未来的应用架构、数据架构…

面向对象基础-继承

1.继承定义 继承是一种**“is-a”**&#xff08;“是一个”&#xff09;关系&#xff0c;它表示一个类是另一个类的特殊化版本。 2.继承作用 通过继承&#xff0c;子类能够获取父类的属性和方法&#xff0c;并且可以对这些属性和方法进行增强、扩展或重写 3.继承特点 3.1子…

计算机网络——应用层(DNS域名系统、文件传输协议FTP、远程终端协议TELNET、万维网)

应用层概述 不同网络应用的应用进程之间&#xff0c;还需要用不同的通信规则。因此在运输层协议之上&#xff0c;还需要有应用层协议。 每个应用层协议都是为了解决某一类应用问题&#xff0c;而问题的解决又必须通过位于不同主机中的多个应用进程之间的通信和协同工作来完成。…

C++算法练习-day2——27.移除元素

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 给定一个有序数组和一个目标值&#xff0c;题目要求从数组中移除所有等于目标值的元素&#xff0c;并返回移除后数组的新长度。注意&#xff0c;题目要求原地修改数组&#xff0c;即不使用额外的…

YoloV8改进:Block改进|使用ContextAggregation模块改善C2f模块|即插即用

摘要 在计算机视觉领域,目标检测与实例分割任务一直是研究的热点。YoloV8作为目标检测领域的佼佼者,凭借其出色的性能和效率赢得了广泛的认可。然而,随着技术的不断进步,如何进一步提升YoloV8的性能成为了我们追求的目标。近期,我们引入了ContextAggregation模块对YoloV8…

信息安全工程师(53)网络安全审计机制与实现技术

前言 网络安全审计机制是指为了保护网络安全并发现潜在风险和漏洞而进行的一系列审计活动。审计的目的是检查并评估网络系统的安全性&#xff0c;以确保其符合相关法律法规和安全标准。 一、网络安全审计机制的重要性 网络安全审计机制对于保护组织的信息资产和敏感数据至关重要…

LabVIEW提高开发效率技巧----高效文件I/O

在LabVIEW开发中&#xff0c;文件I/O操作常常是性能瓶颈之一&#xff0c;特别是处理大数据时&#xff0c;如何高效地存储和读取数据显得尤为重要。本文将详细介绍如何利用TDMS Streaming来实现高效的文件I/O&#xff0c;并结合具体例子说明在实际开发中的应用技巧。 1. 什么是T…