【FreeRTOS】——中断优先级设置中断相关寄存器临界段代码保护调度器挂起与恢复

news2024/11/26 0:48:05

目录

前言:

一、中断优先级设置

二、中断相关寄存器(STM32-Cortex M3)

三、临界段代码保护

四、任务调度器的挂起和恢复

总结:


前言:

博客笔记根据正点原子视频教程编辑,仅供学习交流使用!

一、中断优先级设置

①中断概念回顾

让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断。可简单概括为以下三步:

                   

② 优先级分组设置

ARM Cortex-M 使用了 8 位宽的寄存器(256级)来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器。但STM32,只用了中断优先级配置寄存器的高4位 [7 : 4],所以STM32提供了最大16级的中断优先等级。

             

 STM32 的中断优先级可以分为抢占优先级子优先级抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断。子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行。(中断优先级数值越小越优先)

优先级的设置有5 种分配方式,对应着中断优先级分组的 5 个组,通过在在HAL_Init()中调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置(FreeRTOS中常用NVIC_PriorityGroup_4):

            

 注意:低于5级优先级的中断里才可调用FreeRTOS的API函数。在FreeRTOS中常把4位都设置为抢占优先级即NVIC_PriorityGroup_4。中断优先级数值越小越优先,任务优先级数值越大越优先。


二、中断相关寄存器(STM32-Cortex M3)

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

一个寄存器是32位的,它的地址是这一段区域的首地址(8位),要设置一个寄存器区域的非首地址(如PendSV和SysTick),通过首地址偏移bit即可。

SHPR1寄存器地址:0xE000ED1

SHPR2寄存器地址:0xE000ED1C

SHPR3寄存器地址:0xE000ED20

         

 注意:PendSV和SysTick设置最低优先级,保证系统任务切换不会阻塞系统其他中断的响应。即中断可打断任务,但任务不可打断中断。

②三个中断屏蔽寄存器

  

注意:FreeRTOS利用的BASEPRI这个寄存器完成对中断的管理。该寄存器屏蔽优先级低于某个阈值(或优先级号大于某个值)的中断,如BASEPRI设置为0x50(配置优先级只用到低4位,只用到高四位[7:4],所以这里写的是5向左偏移4位的值),代表中断优先级在5~15内的均被屏蔽,0~4的中断优先级正常执行。当BASEPRI设置为0,不关闭任何中断(不是屏蔽所有中断的意思)。

关闭中断优先级在5-15的中断程序示例:

#define portDISABLE_INTERRUPTS() 		vPortRaiseBASEPRI()
static portFORCE_INLINE void vPortRaiseBASEPRI( void ) 
{ 
	uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; 
	__asm 
	{
		msr basepri, ulNewBASEPRI 
		dsb 
		isb
	} 
}
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )  
/*STM32中断优先级只用高4位配置,偏移4位*/
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        5      
/* FreeRTOS可管理的最高中断优先级 ,也即把BASEPRI设置为0x50*/ 

  

 FreeRTOS说:“我可以中断你,可以让你用我的API函数;我不能中断你,你也不能用我的API函数!”

注意:中断服务函数的优先级需在FreeRTOS所管理的范围内;中断服务函数里边需调用FreeRTOS的API函数,必须使用带“FromISR”后缀的函数。

 开中断代码示例(即BASEPRI设置为0):

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

三、临界段代码保护

临界段代码:也叫做临界区,是指那些必须完整运行,不能被打断的代码段。

使用场合:①外设:需严格按照时序初始化的外设,如I2C、SPI等。②系统在自身需求。③用户的某些需求。

能够打断当前程序运行的:中断、任务调度(PendSV相关)。要想程序不被打断,关中断即可(指FreeRTOS所管辖的最高级别中断),因为PendSV是与任务切换有关的一个中断,被设置成了最低优先级,所以关中断后,PendSV(与任务调度器有关)也一定不会响应。

FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断!

    

 无论是任务级还是中断级临界区本质都是关中断,代码是成对使用的,且支持嵌套,可尽量保持临界段耗时短

//任务级临界区调用格式示例
taskENTER_CRITICAL() ;
{
        … …	/* 临界区 */
}
taskEXIT_CRITICAL()	;


//中断级临界区调用格式示例(这段写在中断服务函数里)
uint32_t  save_status;
save_status  = taskENTER_CRITICAL_FROM_ISR();
{
        … …	/* 临界区 */
}
taskEXIT_CRITICAL_FROM_ISR(save_status );

四、任务调度器的挂起和恢复

 调用挂起任务调度器的函数时不需要关闭中断;仅仅是防止了任务之间的资源争夺,中断照样可以直接响应。

挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全。

           

vTaskSuspendAll() ;
{
        … …	/* 内容 */
}
xTaskResumeAll()	;

总结:

实时操作系统是嵌入式学习的进阶内容,掌握好在面试时会有巨大优势!

往期精彩:

电机应用控制——直流无刷电机

OpenCV机器视觉系列专栏

C语言进阶

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

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

相关文章

电子器件系列38:mos管散热片

板子上需要用到一个封装为to220的mos管&#xff0c;还得立起来散热&#xff0c;得要加一个散热片。 散热片简介&#xff0c;分类&#xff1f;用途&#xff1f;如何使用&#xff1f;封装&#xff1f;使用注意事项&#xff1f; 简介&#xff1a; mos散热片是一种给电器中的易发热…

线程池实现

一、线程池介绍 1&#xff09;应用场景 当并发数很多的时候&#xff0c;并且每个线程执行时间很短的任务&#xff0c;这样就会频繁创建线程&#xff0c;而这样的频繁创建和销毁线程会大大降低系统的执行效率。对于这种场景我们可以使用线程池来复用之前创建的线程&#xff0c…

Linux—基础篇:目录结构

1、基本介绍 1、linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构的最上层是根目录“/”,然后在此目录下创建其他目录 2、在Linux的世界里&#xff0c;一切皆文件&#xff01;&#xff01;&#xff01; 2、具体的目录结构 不用背&#xff0c;知道即可 2.1、…

价值1000元的稀有二开版的无限坐席在线客服系统源码+教程

demo软件园每日更新资源,请看到最后就能获取你想要的: 1.价值1000元的稀有二开版的无限坐席在线客服系统源码教程 价值1000元的稀有二开版的无限坐席在线客服系统源码 直接一键安装的&#xff0c;启动两个端口就行了&#xff0c;安装倒是简单 类型&#xff1a;在线客服系统 …

MathType7精简版数学公式编辑器

许多简单的数学公式&#xff0c;我们可以使用输入法一个个找到特殊符号并输入&#xff0c;但是对于高等数学中较多复杂的公式符号&#xff0c;是很难使用输入法完成的。那么&#xff0c;我们就需要借助公式编辑器&#xff0c;这里推荐一款我自己正在使用的MathType。 MathType是…

Redis单机数据库

文章目录 一、Redis数据库Redis数据库redisDb数据库键空间——dict过期字典——expires设置键的生存时间移除键的过期时间返回键的生存时间 Redis的过期删除策略1、定期删除2、惰性删除3、内存淘汰机制 过期键处理1、RDB功能对过期键的处理2、AOF功能对过期键的处理3、复制功能…

chatgpt赋能python:Python隐藏变量:探秘程序内部的“奥秘”

Python 隐藏变量&#xff1a;探秘程序内部的“奥秘” 作为一门高级编程语言&#xff0c;Python备受程序员的欢迎。但是&#xff0c;你是否了解Python隐藏变量&#xff1f;这些看似神秘的变量对程序员的编码工作有哪些影响呢&#xff1f;本篇文章将为您详细介绍Python隐藏变量的…

Hive 实现ACID

Hive官方提示&#xff0c;Hive在版本0.14之后可以支持对表数据的UPDATE和DELETE&#xff1a; 具体操作如下&#xff1a; -- 环境参数设置 set hive.support.concurrencytrue; set hive.txn.managerorg.apache.hadoop.hive.ql.lockmgr.DbTxnManager;-- 建表&#xff0c;以ORC的…

【MySQL新手到通关】第六章 时间日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…

VSLAM视觉里程计总结

相机模型是理解视觉里程计之前的基础。视觉里程计&#xff08;VIO&#xff09;主要分为特征法和直接法。如果说特征点法关注的是像素的位置差&#xff0c;那么&#xff0c;直接法关注的则是像素的颜色差。特征点法通常会把图像抽象成特征点的集合&#xff0c;然后去缩小特征点之…

Docker容器 和 Kubernetes容器集群管理系统

一、快速了解Docker 1. 什么是Docker的定义 Docker 是一个开源的应用容器引擎&#xff0c;基于Go语言并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以…

C#,码海拾贝(23)——求解“复系数线性方程组“的“全选主元高斯消去法“之C#源代码,《C#数值计算算法编程》源代码升级改进版

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary&g…

【C++】利用游戏壳实现飞机大战(设计类图、开发实现)

文章目录 飞机大战飞机大战类图分析背景类&#xff08;CBackGround&#xff09;成员属性成员函数 程序类&#xff08;CPlaneApp&#xff09;成员属性成员函数 玩家类&#xff08;CPlayer&#xff09;成员属性成员函数 炮弹类&#xff08;CGunner&#xff09;成员属性成员函数 炮…

AI周报-一周发生两次Ai事件;DragGAN 问世

&#x1f680; AI 图像编辑技术 DragGAN 问世&#xff0c;用户可以通过拖拽改变汽车大小或人物表情等 近日&#xff0c;马克斯・普朗克计算机科学研究所研究者们推出了一种控制GAN的新方法DragGAN&#xff0c;用户可以通过拖拽改变汽车大小或人物表情等。 DragGAN类似于Photo…

Rk1126 实现 yolov5 6.2 推理

基于 RK1126 实现 yolov5 6.2 推理. 转换 ONNX python export.py --weights ./weights/yolov5s.pt --img 640 --batch 1 --include onnx --simplify 安装 rk 环境 安装部分参考网上, 有很多. 参考: https://github.com/rockchip-linux/rknpu 转换 RK模型 并验证 yolov562_t…

企业想提高商机转化率该如何挑选CRM系统

CRM客户管理系统可以帮助销售人员跟踪和分析潜在客户的需求、行为和偏好&#xff0c;制定合适的销售策略&#xff0c;提高商机转化率。下面我们就来说说&#xff0c;CRM系统如何加速销售商机推进。 1、跟踪客户和动态 Zoho CRM可以帮助您记录和分析客户的需求、行为和偏好&am…

8 年 SQL 人,撑不过前 6 题

抱歉各位&#xff0c;标题党了。。 前两天发布了一款 SQL 题集&#xff1a; 开发了一个SQL数据库题库小程序 <<- 戳它直达 群里小伙伴反馈&#xff0c;太简单&#xff1a; 于是&#xff0c;我又改版了下&#xff1a; 列举几题&#xff0c;大家看看难度&#xff1a; SQL S…

Python类的成员介绍

Python类的成员介绍 在Python中&#xff0c;类&#xff08;class&#xff09;是一种定义对象的模板。对象是由类创建的实例&#xff0c;它们具有属性和方法。属性是对象的变量&#xff0c;而方法是对象的函数。 定义在类中的变量也称为属性&#xff0c;定义在类中的函数也称为方…

DragGAN:interactive point-based manipulation on the generative image manifold

AI绘画可控性研究与应用清华美院课程的文字稿和PPThttps://mp.weixin.qq.com/s?__bizMzIxOTczNjQ2OQ&mid2247484794&idx1&sn3556e5c467512953596237d71326be6e&chksm97d7f580a0a07c968dedb02d0ca46a384643e38b51b871c7a4f89b38a04fb2056e084167be05&scene…

基于html+css的图展示97

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…