[FreeRTOS- 野火] - - - 临界段

news2025/6/2 8:41:25

一、介绍

临界段最常出现在对一些全局变量进行操作的场景。

1.1 临界段的定义

临界段是指在多任务系统中,一段需要独占访问共享资源的代码。在这段代码执行期间,必须确保没有任何其他任务或中断可以访问或修改相同的共享资源。

临界段的主要目的是防止多个任务或中断同时访问共享资源,从而避免数据不一致或竞态条件。

1.2 临界段的特点

  • 1、互斥访问:

    • 临界段内的代码必须确保在任何时刻只有一个任务或中断可以访问共享资源。

    • 其他任务或中断必须等待,直到当前任务或中断完成对共享资源的访问。

  • 2、短小精悍:

    • 临界段的代码应该尽可能短小,以减少对系统性能的影响。

    • 长时间的临界段可能会导致系统响应延迟,影响实时性。

  • 3、明确的入口和出口:

    • 临界段必须有明确的入口和出口。

    • 入口处通常会禁用中断,出口处会恢复中断。

1.3 临界段的实现方式

在RTOS中,临界段可以通过以下几种方式实现:

  • 1、禁用中断:

    • 直接禁用所有中断:通过设置硬件寄存器(如Cortex-M的 PRIMASK)来禁用所有中断。

    • 设置中断优先级阈值:通过设置硬件寄存器(如Cortex-M的 BASEPRI)来屏蔽优先级高于某个值的中断。

  • 2、使用互斥量(Mutex):

    • 互斥量是一种同步原语,用于确保对共享资源的互斥访问。

    • 任务在访问共享资源前必须先获取互斥量,访问完成后释放互斥量。

// 创建互斥量
SemaphoreHandle_t xMutex = xSemaphoreCreateMutex();

// 获取互斥量
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE)
{
    // 临界段代码
}

// 释放互斥量
xSemaphoreGive(xMutex);
  • 3、使用信号量(Semaphore):

    • 信号量是一种计数器,用于控制对共享资源的访问。

    • 任务在访问共享资源前必须先获取信号量,访问完成后释放信号量。

// 创建信号量
SemaphoreHandle_t xSemaphore = xSemaphoreCreateBinary();

// 获取信号量
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE)
{
    // 临界段代码
}

// 释放信号量
xSemaphoreGive(xSemaphore);
  • 4、使用自旋锁(Spinlock):

    • 自旋锁是一种简单的同步机制,任务在获取锁时会不断尝试,直到获取成功。

    • 自旋锁通常用于短时间的临界段,以减少上下文切换的开销。

二、Cortex-M内核快速关中断指令

为了快速地开关中断, Cortex-M 内核专门设置了一条 CPS 指令,有 4 种用法,具体如下:

CPSID I ;PRIMASK=1 ;	//关中断
CPSIE I ;PRIMASK=0 ;	//开中断
CPSID F ;FAULTMASK=1 ;	//关异常
CPSIE F ;FAULTMASK=0 ;	//开异常

在ARM Cortex-M系列处理器中,PRIMASK、FAULTMASK 和 BASEPRI 是三个用于控制中断和异常处理的系统级寄存器。

2.1 PRIMASK

  • 功能:禁用除NMI(不可屏蔽中断)和Hard Fault(硬件故障)之外的所有异常和中断。

  • 作用机制:设置 PRIMASK (通过 MSR PRIMASK, #1 或 CPSID I;)把当前中断优先级提为0,来屏蔽除NMI和Hard Fault之外的所有异常和中断。

  • 典型用途:用于快速进入临界区,保护关键代码段不被中断打断,例如在RTOS任务切换或共享资源访问等应用中。

  • 特点:简单易用,但对系统实时性影响较大,长时间开启可能导致高优先级中断无法响应。

是一个单一比特的寄存器。缺省值是0,表示没有关中断。

2.2 FAULTMASK

  • 功能:禁用除NMI之外的所有异常和中断,包括Hard Fault。

  • 作用机制:设置 FAULTMASK(通过MSR FAULTMASK, #1或CPSID F ;)会把当前中断优先级提升到-1,仅允许NMI。

  • 典型用途:在异常处理程序中临时屏蔽可能引发嵌套故障的操作(如内存访问)。

  • 特点:比PRIMASK更严格,可能影响系统稳定性,仅在特权模式(Privileged Mode)下可修改。

是一个只有1位的寄存器。缺省值是0,表示没有关异常。

2.3 BASEPRI

  • 功能:基于优先级的动态中断屏蔽,仅屏蔽优先级低于阈值的中断。

  • 作用机制:设置 BASEPRI (通过 MSR BASEPRI, #priority)允许优先级低于阈值的中断继续执行,高于阈值的中断被屏蔽。

  • 典型用途:灵活控制中断优先级,允许高优先级任务/中断优先执行,同时屏蔽低优先级中断。

  • 特点:更精细的控制,避免完全禁用所有中断,但需要合理设置优先级阈值,否则可能导致意外屏蔽。

三、关中断

关中断函数分为带返回值不带返回值两种。

3.1 不带返回值的关中断函数

static portFORCE_INLINE void vPortRaiseBASEPRI( void )		// 不带返回值的函数是不能嵌套的
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

	__asm
	{
		/* Set BASEPRI to the max syscall priority to effect a critical
		section. */
		msr basepri, ulNewBASEPRI			// 11 大于11的中断不能被响应 小于11则可以 根据 configMAX_SYSCALL_INTERRUPT_PRIORITY 的值来配置
		dsb
		isb
	}
}
  • dsb(Data Synchronization Barrier):数据同步屏障,确保所有之前的内存访问操作(如读写操作)都完成后再继续执行后续代码。
  • isb(Instruction Synchronization Barrier):指令同步屏障,确保所有之前的指令都执行完成后再继续执行后续代码。

3.2 带返回值的关中断函数

static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void )		// 可嵌套
{
uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

	__asm
	{
		/* Set BASEPRI to the max syscall priority to effect a critical
		section. */
		mrs ulReturn, basepri					// 先将 basepri 的值保存在 返回值中
		msr basepri, ulNewBASEPRI			// 再设置 basepri 的值
		dsb
		isb
	}

	return ulReturn;
}

四、开中断

static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{
	__asm
	{
		/* Barrier instructions are not used as this function is only used to
		lower the BASEPRI value. */
		msr basepri, ulBASEPRI
	}
}

五、进入/退出临界段的宏

5.1 进入临界段的宏

5.1.1 不带中断保护

#define taskENTER_CRITICAL() portENTER_CRITICAL()	// task.h中定义

#define portENTER_CRITICAL() vPortEnterCritical()	// portmacro.h中定义

#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()	// portmacro.h中定义

5.1.2 带中断保护

#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()	// task.h 中定义

#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI()	// portmacro.h 中定义

5.2 退出临界段的宏

5.2.1 不带中断保护

#define taskEXIT_CRITICAL() portEXIT_CRITICAL()		// task.h 中定义

#define portEXIT_CRITICAL() vPortExitCritical()		// portmacro.h 中定义
 
#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 )	//portmacro.h 中定义

5.2.2 带中断保护

#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )	// task.h 中定义

#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x)	//  portmacro.h 中定义

六、临界段代码的应用

在 FreeRTOS 中,对临界段的保护出现在两种场合,一种是在中断场合,一种是在非中断场合

6.1 中断场合

// 在中断场合,临界段可以嵌套
{
	uint32_t ulReturn;
	
	// 进入临界段,临界段可以嵌套
	ulReturn = taskENTER_CRITICAL_FROM_ISR();

	// 临界段代码

	// 退出临界段
	taskEXIT_CRITICAL_FROM_ISR( ulReturn );
}

6.2 非中断场合

// 非中断场合,临界段不能嵌套
{
	// 进入临界段
	taskENTER_CRITICAL();

	// 临界段代码

	// 退出临界段
	taskEXIT_CRITICAL();
}

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

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

相关文章

NodeMediaEdge接入NodeMediaServer

如何使用NME接入NMS 简介 NodeMediaEdge是一款部署在监控摄像机网络前端中,拉取Onvif或者rtsp/rtmp/http视频流并使用rtmp/kmp推送到公网流媒体服务器的工具。 通过云平台协议注册到NodeMediaServer后,可以同NodeMediaServer结合使用。使用图形化的管理…

【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤

在Java开发的世界里,选择一个强大的集成开发环境(IDE)是迈向高效编程的第一步。而IntelliJ IDEA无疑是Java开发者中最受欢迎的选择之一。它以其强大的功能、智能的代码辅助和简洁的用户界面,帮助无数开发者快速构建和部署Java项目…

PHP7+MySQL5.6 查立得源码授权系统DNS验证版

# PHP7MySQL5.6 查立得源码授权系统DNS验证版 ## 一、系统概述 本系统是一个基于PHP7和MySQL5.6的源码授权系统,使用DNS TXT记录验证域名所有权,实现对软件源码的授权保护。 系统支持多版本管理,可以灵活配置不同版本的价格和下载路径&#…

【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack (下)

1.目标 网址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 我们知道了 sign P(n.data)&#xff0c;其中n.data是明文的请求参数 2.webpack生成data加密参数 那么 L(n.data)就是密文的请求参数。返回一个Promise {<pending>}&#xff0c;所以L(n.data) 是一个异步函数…

3D虚拟工厂

1、在线体验 3D虚拟工厂在线体验 vue3three.jsblender 2、功能介绍 1. 全屏显示功能2. 镜头重置功能3. 企业概况信息模块4. 标签隐藏/显示功能5. 模型自动旋转功能6. 办公楼分层分解展示7. 白天/夜晚 切换8. 场景资源预加载功能9. 晴天/雨天/雾天10. 无人机视角模式11. 行人…

http传输协议的加密

创建目录存放签证 [rootserver100 ~]# mkdir /etc/nginx/certs [rootserver100 ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /etc/nginx/certs/timinglee.org.key -x509 -days 365 -out /etc/nginx/certs/timinglee.org.crt ..................................…

半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司

半导体晶圆制造洁净厂房的微振控制方案-江苏泊苏系统集成有限公司 微振控制在现行国家标准《电子工业洁净厂房设计规范》GB50472中有关微振控制的规定主要有&#xff1a;洁净厂房的微振控制设施的设计分阶段进行&#xff0c;应包括设计、施工和投产等各阶段的微振测试、厂房建…

常见压缩算法性能和压缩率对比 LZ4 LZO ZSTD SNAPPY

网传压缩算法对比表 算法压缩率压缩速度解压速度支持流式压缩适用场景LZ4低极快极快是实时数据压缩、日志压缩、内存缓存等Zstandard高快快是文件压缩、网络传输、数据库备份等Brotli很高中等快是静态资源压缩&#xff08;HTML、CSS、JS&#xff09;等LZO低极快快是嵌入式系统…

Spring Boot 应用中实现配置文件敏感信息加密解密方案

Spring Boot 应用中实现配置文件敏感信息加密解密方案 背景与挑战 &#x1f6a9;一、设计目标 &#x1f3af;二、整体启动流程 &#x1f504;三、方案实现详解 ⚙️3.1 配置解密入口&#xff1a;EnvironmentPostProcessor3.2 通用解密工具类&#xff1a;EncryptionTool 四、快速…

【TTS】基于GRPO的流匹配文本到语音改进:F5R-TTS

论文地址&#xff1a;https://arxiv.org/abs/2504.02407v3 摘要 我们提出了F5R-TTS&#xff0c;这是一种新颖的文本到语音(TTS)系统&#xff0c;它将群体相对策略优化(GRPO)集成到基于流匹配的架构中。 通过将流匹配TTS的确定性输出重新表述为概率高斯分布&#xff0c;我们的方…

动态规划-152.乘积最大子数组-力扣(LeetCode)

一、题目解析 根据示例nums数组中存在负数&#xff0c;下面分析时需注意 二、算法原理 1、状态表示 此时f[i]表示&#xff1a;以i位置为结尾的所有子数组中的最大乘积&#xff0c;但是由于nums中存在负数&#xff0c;所以还需要g[i]表示&#xff1a;以i位置为结尾的所有子数组…

1-1 初探Dart编程语言

Dart 是 Google 最初开发的一种开源编程语言&#xff0c;适用于客户端与服务端开发。它配套提供 Dart SDK&#xff0c;其中包含 Dart 编译器、Dart 虚拟机&#xff08;Dart VM&#xff09;以及一个名为 dart2js 的工具&#xff0c;可将 Dart 脚本转换为 JavaScript&#xff0c;…

搭建最新版开源监控平台SigNoz踩的坑

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权并注明出处。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 一、前言 SigNoz 是一款开源应用程序性能监控工具&#xff0c;在往期相关文章&#xff08;文末有链接&#xff09;中…

无人机多人协同控制技术解析

一、运行方式 无人机多人点对点控制通常采用以下两种模式&#xff1a; 1. 主从控制模式 指定一个主控用户拥有最高优先级&#xff0c;负责飞行路径规划、紧急操作等关键指令&#xff1b;其他用户作为观察者&#xff0c;仅能查看实时画面或提交辅助指令&#xff0c;需经主…

【东枫科技】KrakenSDR 测向快速入门指南

本快速入门指南旨在帮助您使用运行在 Raspberry Pi 4/5 或 Orange Pi 5B (OPI5B)&#xff08;带 WiFi 型号&#xff09;上的 KrakenSDR 尽快连接到测向应用程序。不过&#xff0c;请务必阅读本手册的其余部分&#xff0c;以了解无线电测向的工作原理。 你需要什么 本指南假设…

【Redis】hash

Hash 哈希 几乎所有的主流编程语言都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射等。在 Redis 中&#xff0c;哈希类型指值本身又是一个键值对结构&#xff0c;形如 key “key”, value {{field1, value1}, …{field…

基于Vite的前端自动化部署方案

&#x1f468; 作者简介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;全栈领域创作者 ✒️ 个人主页&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;点赞&#x1f44d;&#x1f4dd; 评论 ⭐️收藏 文章目录 前言一、主流解决方案二、了解SCP概念三、自动化部署…

antDesignVue中a-upload上传组件的使用

工作中需要使用上传组件&#xff0c;记录一下a-upload部分属性用法 1.showUploadList属性使用 使用:showUploadList"{ showRemoveIcon: true ,showDownloadIcon: true }"属性可控制右侧下载&#xff0c;删除图标 2.如何实现回显功能 使用:defaultFileList"fil…

龙舟竞渡与芯片制造的共通逻辑:华芯邦的文化破局之道

端午节承载着中华民族数千年的精神密码&#xff0c;龙舟最初是古人沟通天地、祈求风调雨顺的仪式载体。战国时期&#xff0c;屈原投江的悲壮故事为端午注入了家国情怀&#xff0c;龙舟竞渡从此兼具纪念英雄与祈福避疫的双重意义。这种文化内核&#xff0c;与深圳市华芯邦“以科…

机房网络设备操作安全管理制度

该制度围绕机房网络设备操作安全,规定账号实行系统管理员、操作管理员、一般用户三级分级管理,遵循最小授权和权限分割原则,账号需实名制、禁止共享及转借,密码设置需至少 8 位、3 种字符组合且每 3 个月修改一次;高危指令执行需上级审批、双人核查,远程登录需限制权限、…