[FreeRTOS- 野火] - - - 临界段
一、介绍
临界段最常出现在对一些全局变量进行操作的场景。
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 criticalsection. */msr basepri, ulNewBASEPRI // 11 大于11的中断不能被响应 小于11则可以 根据 configMAX_SYSCALL_INTERRUPT_PRIORITY 的值来配置dsbisb}
}
- 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 criticalsection. */mrs ulReturn, basepri // 先将 basepri 的值保存在 返回值中msr basepri, ulNewBASEPRI // 再设置 basepri 的值dsbisb}return ulReturn;
}
四、开中断
static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{__asm{/* Barrier instructions are not used as this function is only used tolower 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();
}
相关文章:
[FreeRTOS- 野火] - - - 临界段
一、介绍 临界段最常出现在对一些全局变量进行操作的场景。 1.1 临界段的定义 临界段是指在多任务系统中,一段需要独占访问共享资源的代码。在这段代码执行期间,必须确保没有任何其他任务或中断可以访问或修改相同的共享资源。 临界段的主要目的是防…...
【洛谷P9303题解】AC代码- [CCC 2023 J5] CCC Word Hunt
在CCC单词搜索游戏中,单词可以隐藏在字母网格中,以直线或直角的方式排列。以下是对代码的详细注释和解题思路的总结: 传送门: https://www.luogu.com.cn/problem/P9303 代码注释 #include <iostream> #include <vecto…...

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

【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤
在Java开发的世界里,选择一个强大的集成开发环境(IDE)是迈向高效编程的第一步。而IntelliJ IDEA无疑是Java开发者中最受欢迎的选择之一。它以其强大的功能、智能的代码辅助和简洁的用户界面,帮助无数开发者快速构建和部署Java项目…...
WebSocket指数避让与重连机制
1. 引言 在现代Web应用中,WebSocket技术已成为实现实时通信的重要手段。与传统的HTTP请求-响应模式不同,WebSocket建立持久连接,使服务器能够主动向客户端推送数据,极大地提升了Web应用的实时性和交互体验。然而,在实…...
DrissionPage WebPage模式:动态交互与高效爬取的完美平衡术
在Python自动化领域,开发者常面临两难选择:Selenium虽能处理动态页面但效率低下,Requests库轻量高效却难以应对JavaScript渲染。DrissionPage的WebPage模式创新性地将浏览器控制与数据包收发融为一体,为复杂网页采集场景提供了全新…...
adb查看、设置cpu相关信息
查内存 adb shell dumpsys meminfo查CPU top -m 10打开 system_monitor adb shell am start -n eu.chainfire.perfmon/.LaunchActivity设置CPU的核心数 在/sys/devices/system/cpu目录下可以看到你的CPU有几个核心,如果是双核,就是cpu0和cpu1,…...

PHP7+MySQL5.6 查立得源码授权系统DNS验证版
# PHP7MySQL5.6 查立得源码授权系统DNS验证版 ## 一、系统概述 本系统是一个基于PHP7和MySQL5.6的源码授权系统,使用DNS TXT记录验证域名所有权,实现对软件源码的授权保护。 系统支持多版本管理,可以灵活配置不同版本的价格和下载路径&#…...
68元开发板,开启智能硬件新篇章——明远智睿SSD2351深度解析
在智能硬件开发领域,开发板的选择至关重要。它不仅关系到项目的开发效率,还直接影响到最终产品的性能与稳定性。而今天,我要为大家介绍的这款明远智睿SSD2351开发板,仅需68元,却拥有远超同价位产品的性能与功能&#x…...

【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack (下)
1.目标 网址:https://y.qq.com/n/ryqq/toplist/26 我们知道了 sign P(n.data),其中n.data是明文的请求参数 2.webpack生成data加密参数 那么 L(n.data)就是密文的请求参数。返回一个Promise {<pending>},所以L(n.data) 是一个异步函数…...
基于netmiko模块实现支持SSH or Telnet的多线程多厂商网络设备自动化巡检脚本
自动化巡检的需求 巡检工作通常包含大量的重复性操作,而这些重复性特征意味着其背后存在明确的规则和逻辑。这种规律性为实现自动化提供了理想的前提条件。 自动化工具 我们这里采用python作为自动化的执行工具。 过程 安装 netmiko pip install netmiko 模块的使…...
不用 apt 的解决方案(从源码手动安装 PortAudio)
第一步:下载并编译 PortAudio 源码 cd /tmp wget http://www.portaudio.com/archives/pa_stable_v190600_20161030.tgz tar -xvzf pa_stable_v190600_20161030.tgz cd portaudio# 使用 cmake 构建(推荐): mkdir build &&…...
【前端】JS引擎 v.s. 正则表达式引擎
JS引擎 v.s. 正则表达式引擎 它们的转义符都是\ 经过JS引擎会进行一次转义 经过正则表达式会进行一次转义在一次转义中\\\\\的转义过程: 第一个 \ (转义符) 会“吃掉”第二个 \,结果是得到一个字面量的 \。 第三个 \ (转义符) 会“吃掉”第四个 \&#x…...
开发体育平台,怎么接入最合适的数据接口
一、核心需求匹配:明确平台功能定位 1.实时数据驱动型平台 需重点关注毫秒级延迟与多端同步能力。选择支持 WebSocket 协议的接口,可实现比分推送延迟 < 0.5秒。例如某电竞直播平台通过接入支持边缘计算的接口,将团战数据同步速度提升至…...

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中有关微振控制的规定主要有:洁净厂房的微振控制设施的设计分阶段进行,应包括设计、施工和投产等各阶段的微振测试、厂房建…...
嵌入式(1):STM32 GPIO与AFIO深度解析:从原理到高阶应用实战
写在前面:本文基于STM32官方参考手册与实际项目经验,系统总结GPIO与AFIO的核心技术要点。每行代码都经过实际验证,可直接用于项目开发。 一、GPIO:芯片与世界的桥梁 1.1 GPIO的8种工作模式详解 工作模式等效电路典型应用场景配置…...
Netty 实战篇:Netty RPC 框架整合 Spring Boot,迈向工程化
本文将基于前面构建的 RPC 能力,尝试将其与 Spring Boot 整合,借助注解、自动扫描、依赖注入等机制,打造“开箱即用”的 Netty RPC 框架,提升开发效率与工程规范。 一、为什么要整合 Spring Boot? 手动 new 实例、写注…...
QML视图组件ListView、TableView、GridView介绍
1 MVD模型 Model:模型,包含数据及其结构。View:视图,用于显示数据。Delegate:代理,规定数据在视图中的显示方式。2 ListView 以列表形式展示数据。2.1 属性 model:设置或获取列表视图的数据模型delegate:定义了列表中每一项的外观和行为currentIndex:获取或设置当前选…...

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

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

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

动态规划-152.乘积最大子数组-力扣(LeetCode)
一、题目解析 根据示例nums数组中存在负数,下面分析时需注意 二、算法原理 1、状态表示 此时f[i]表示:以i位置为结尾的所有子数组中的最大乘积,但是由于nums中存在负数,所以还需要g[i]表示:以i位置为结尾的所有子数组…...

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

搭建最新版开源监控平台SigNoz踩的坑
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权并注明出处。感谢您喜爱本文,请文明转载,谢谢。 一、前言 SigNoz 是一款开源应用程序性能监控工具,在往期相关文章(文末有链接)中…...
Ubuntu 服务器配置与 Cloudflare Tunnel 部署指南 免费内网穿透家用服务器
Ubuntu 服务器配置与 Cloudflare Tunnel 部署指南 本文档总结了服务器配置相关内容,包括 Ubuntu 服务器配置、硬盘扩容、静态 IP 设置以及 Cloudflare Tunnel 的部署步骤。 目录 硬盘分区与扩容设置静态 IPCloudflare Tunnel 部署SSH 通过 Cloudflare Tunnel常见…...

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

【东枫科技】KrakenSDR 测向快速入门指南
本快速入门指南旨在帮助您使用运行在 Raspberry Pi 4/5 或 Orange Pi 5B (OPI5B)(带 WiFi 型号)上的 KrakenSDR 尽快连接到测向应用程序。不过,请务必阅读本手册的其余部分,以了解无线电测向的工作原理。 你需要什么 本指南假设…...
使用LangChain与多模态模型实现图像中的文字和表格提取(PDF可转图片)
引言 在实际工程应用中,经常需要处理含有工程检验标准、施工图纸等复杂内容的PDF文档。这些文档往往包含大量水印、背景图层或无关信息,直接使用OCR识别容易引入噪声,影响后续的信息处理与分析。 为了解决这一问题,我尝试通过网页版Qwen进行测试,发现其对图像中的文字和…...