当前位置: 首页 > article >正文

FreeRTOS 锁(信号量)

目录临界区critical sections互斥量Mutex优先级继承性code示例递归互斥量code示例二值信号量Binary Semaphore同步功能code示例计数信号量Counting Semaphore相关接口参考FreeRTOS中常见的用于同步/互斥访问的锁机制临界区critical sections该方法适用于极短code段的保护优先级高响应快但要注意保持时间尽可能短否则会影响实时性(调用时会关闭中断因而会影响系统响应时间)调用taskENTER_CRITICAL() 会全局禁用中断禁止上下文切换保持在运行状态直到退出临界区。适用于任务较短的临界区task执行时间较大会对中断时间产生不利影响void taskENTER_CRITICAL( void ); void taskEXIT_CRITICAL( void );可用于中断服务程序ISR的 taskENTER_CRITICAL() 版本但需要注意保存进入临界区时的中断掩码状态。UBaseType_t uxSavedInterruptStatus; uxSavedInterruptStatus taskENTER_CRITICAL_FROM_ISR(); /* 临界区 */ taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );互斥量Mutex该方式适用于互斥访问保护需要较长时间访问的资源。但使用时需要确保configSUPPORT_DYNAMIC_ALLOCATION 和 configUSE_MUTEXES 在FreeRTOSConfig.h 中设置为 1。优先级继承性互斥锁具有优先级继承机制如果另一个更高优先级任务B尝试获取与相对低的任务A相同的互斥锁则将暂时提高任务A的优先级与任务B优先级相同。该机制可以将优先级翻转危害降到最小。优先级翻转由于低优先级任务正在占用临界资源高优先级任务需要等低优先级任务使用完该资源后释放资源高优先级无法运行而低优先级任务可以运行的现象称为优先级翻转发生优先级翻转对操作系统是致命的危害会导致系统高优先级任务阻塞时间过长。如优先级为H M L的任务如果H在等L的临界资源释放优先级翻转时M被唤醒由于M会抢占L的CPU导致比M更高优先级的H等待更长时间互斥锁不能用在ISR中其特有的优先级继承机制只对任务起作用在中断的上下文环境中毫无意义。如某个task正在持互斥锁ISR中即使加了该锁也并不会因锁被持有而等待锁释放所以互斥锁用在ISR中毫无意义code示例SemaphoreHandle_t xSemaphore; /* 创建 mutex type semaphore */ xSemaphore xSemaphoreCreateMutex(); /* 正常task 中调用示例 */ if( xSemaphore ! NULL ) { /* See if we can obtain the semaphore. If the semaphore is not available wait 10 ticks to see if it becomes free. */ /* 超时等待 */ if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) pdTRUE ) { /* We were able to obtain the semaphore and can now access the shared resource. */ /* ... */ /* We have finished accessing the shared resource. Release the semaphore. */ xSemaphoreGive( xSemaphore ); } else { /* We could not obtain the semaphore and can therefore not access the shared resource safely. */ } } /* 删除互斥量 */ void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );递归互斥量递归互斥锁具有递归访问特性持有该互斥量的任务能够再次获得这个锁而不被挂起这个特性与一般的信号量有很大的不同在信号量中若已经持有该信号量再次获取信号量时会发生主动挂起任务最终形成死锁code示例/* 递归互斥量与普通互斥量使用方法类似 */ /* 创建mutex */ xMutex xSemaphoreCreateRecursiveMutex(); if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) pdTRUE ) { /* 递归互斥量可以被同一个task持有多次但注意释放次数要与take次数相同 */ xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); xSemaphoreGiveRecursive( xMutex ); xSemaphoreGiveRecursive( xMutex ); } /* 删除互斥量 */ void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );二值信号量Binary Semaphore二值信号量是实现任务间通信的机制可以实现任务间同步或临界资源的互斥访问。与互斥量相比二值信号量没有优先级继承机制因而信号量更偏向于同步功能任务与任务间的同步或任务与中断的同步二值信号量是基于队列机制创建的信号量可将其看做一个消息队列该队列只能为空或满 即二值信号量只有0/1两种状态因此二值信号量没有累积性若Task A 连续多次释放最终信号量状态为1Task B take时只会认为有一次释放会错过多余的give因此在使用二值信号量做同步时尽可能避免上述情况若无法避免可使用计数信号量或 task notifications同步功能二值信号量的同步功能有时可以使用直达任务通知Task notifications来代替且比二进制信号量更快更节省内存与linux中的completion类似wait notify二值信号量用作同步功能时的操作流程信号量在创建后被置为空task a 获取信号量进入阻塞task b在某种条件发生后释放信号量task a从而得以获得信号量进入就绪态。如果task a 的优先级是最高的那么就会立即切换任务从而达到两个任务间的同步。同样的在ISR中释放信号量从而达到任务与中断间的同步。code示例#define LONG_TIME 0xffff #define TICKS_TO_WAIT 10 SemaphoreHandle_t xSemaphore NULL; /* Repetitive task. */ void vATask( void * pvParameters ) { /* We are using the semaphore for synchronisation so we create a binary semaphore rather than a mutex. We must make sure that the interrupt does not attempt to use the semaphore before it is created! */ xSemaphore xSemaphoreCreateBinary(); for( ;; ) { /* We want this task to run every 10 ticks of a timer. The semaphore was created before this task was started. Block waiting for the semaphore to become available. (等待ISR GIVE) */ if( xSemaphoreTake( xSemaphore, LONG_TIME ) pdTRUE ) { /* It is time to execute. */ ... /* We have finished our task. Return to the top of the loop where we will block on the semaphore until it is time to execute again. Note when using the semaphore for synchronisation with an ISR in this manner there is no need to give the semaphore back. */ } } } /* Timer ISR */ void vTimerISR( void * pvParameters ) { static unsigned char ucLocalTickCount 0; BaseType_t xHigherPriorityTaskWoken pdFALSE; /* A timer tick has occurred. */ ... Do other time functions. /* Is it time for vATask() to run? */ xHigherPriorityTaskWoken pdFALSE; ucLocalTickCount; if( ucLocalTickCount TICKS_TO_WAIT ) { /* Unblock the task by releasing the semaphore. */ xSemaphoreGiveFromISR( xSemaphore, xHigherPriorityTaskWoken ); /* Reset the count so we release the semaphore again in 10 ticks time. */ ucLocalTickCount 0; } /* Yield if xHigherPriorityTaskWoken is true. The actual macro used here is port specific. */ portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); }计数信号量Counting Semaphore计数信号量可被认为队列长度大于1的任务。与二值信号量一样当任务或中断释放一个信号量信号量的计数值会加1该值表示还有多个事件没被处理即可以不阻塞地take的次数也可以理解为系统中可用的资源数目。计数信号量可以用于资源管理允许多个任务同时访问共享资源但会限制任务的最大数目。相关接口/* 创建计数值为uxMaxCount的计数信号量 */ /* uxInitialCount: 创建信号量时分配给信号量的计数值 */ SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount); /* 返回信号量的计数值该接口也可以用于二值信号量但返回值只有0,1 */ UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );参考FreeRTOS 文档 - FreeRTOS™FreeRTOS内核实现与应用开发实战

相关文章:

FreeRTOS 锁(信号量)

目录 临界区(critical sections) 互斥量(Mutex) 优先级继承性 code示例 递归互斥量 code示例 二值信号量(Binary Semaphore) 同步功能 code示例 计数信号量(Counting Semaphore&#…...

STL---vector详解(从使用到底层)

前言在我的C专栏里有一篇讲解string的文章,里边的各种接口讲解的比较详细,大家对使用有疑惑的可以去我的专栏里看,重复的接口相似的使用我就不再过多介绍了,本文主要讲vector的底层。vector简介vector就是一个会自动扩容的顺序表。…...

【优化升级版】2026在线工具箱源码系统|含字典/成语/查询工具+独立后台管理

温馨提示:文末有联系方式产品核心定位 【优化升级版】2026在线工具箱源码系统,是当前市面上功能最全、稳定性最强的PHP工具聚合平台之一。 本版本由专业团队深度修复并持续迭代,不仅兼容主流建站环境,更强化了SEO结构与蜘蛛抓取友…...

力扣Hot100系列21(Java)——[多维动态规划]总结(不同路径,最小路径和,最长回文子串,最长公共子序列, 编辑距离)

文章目录前言一、不同路径1.题目2.代码3.例子二、最小路径和1.题目2.代码3.例子三、最长回文子串1.题目2.代码3.例子四、最长公共子序列1.题目2.代码3.例子五、 编辑距离1.题目2.代码3.例子前言 本文记录力扣Hot100里面关于多维动态规划的五道题,包括常见解法和一些…...

AI应用架构师助力智能金融系统设计迈向新高度

AI应用架构师:如何重构智能金融系统的“技术基因”? 引言:传统金融系统的“智能焦虑”,你有吗? 凌晨3点,某银行风控部门的张经理还在盯着屏幕——今天又有3笔欺诈交易漏判了。传统的规则引擎已经堆了1000多…...

装修预算装修预算

软装 18000: 沙发 2000 边几 1000 窗帘 5000 餐桌 餐椅 2000 床2 8000 家电 34500: 冰箱 4000 电视机 3000 油烟机灶台热水器 7000 洗碗机 3000 洗衣机 烘干机 4500 扫地机器人 2500 空调3小1大 8000 灯 2500 其他消费3万&#x…...

Ubuntu 22.04外接NVIDIA显卡驱动安装

我的NUC缺一个强大的图形处理硬件, 于是把之前吃灰的显卡坞翻了出来, 发挥点余热, 但是在此之前, 因为开源驱动 nouveau 驱动只能提供基础显示功能,无法调用GPU的加速能力。所以我还需要 彻底禁用nouveau驱动 nouveau是Ubuntu默认的开源驱动,必须禁用&am…...

opencv4.2.0源码安装

git config --global url."https://github.com".insteadOf git://github.comsudo apt update sudo apt upgrade -y# 安装编译工具和依赖库 sudo apt install -y \build-essential \cmake \git \pkg-config \libgtk-3-dev \libavcodec-dev \libavformat-dev \libswsca…...

Ajax Fetch Axios三者的区别

Ajax Fetch Axios三者的区别 三者都用于网路请求,但是不同维度1,Ajax(Asynchronous Javascript and XML),一种技术统称2,Fetch,一个具体的API3,Axios,第三方库https://ax…...

【异常】OpenClaw线上服务器磁盘高位告警故障排查与解决指南 ⚠️ 线上业务节点 磁盘使用率88%(已连续11小时高位运行),建议尽快清理释放空间

一、报错内容 本次故障触发线上服务器监控系统告警,完整告警信息与应急初步处置结果如下: 核心告警条目 ⚠️ 线上业务节点 磁盘使用率88%(已连续11小时高位运行),建议尽快清理释放空间初步应急清理明细 通过临时冗余文件清理,完成首批空间释放,明细如下: 清理项目 预…...

假如后端一次性返回10w条数据,前端如何应对

假如后端一次性返回10w条数据首先设计不合理浏览器能否处理10w条数据1,JS没问题2,渲染到DOM会非常卡顿方案一:自定义中间层(1)自定义nodejs中间层,获取并拆分这10w条数据(2)前端对接…...

【异常】OpenClaw 项目 `fetch failed` 报错问题排查与解决方案Response interrupted: TypeError: fetch failed

OpenClaw 项目 fetch failed 报错问题排查与解决方案 一、报错内容 本次问题核心报错原文如下: Response interrupted: TypeError: fetch failedNode.js 运行环境下常见完整报错上下文(已脱敏): node:internal/deps/undici/undici:xxxxError.captureStackTrace(err, t…...

847-便捷视频剪切-视频片段删除合并工具V1.0

对单个视频文件进行剪辑操作,删除视频中的1个片段或多个片段,删除多个片段后自动合并未删除的视频片段,生成的视频为标准H264编码格式的mp4格式视频。 核心功能 视频播放与预览:拖入视频播放预览区间标记:可视化标记需…...

养龙虾-------【openclaw 对接小红书 】---自动化小红书

🚀 MiniMax Token Plan 惊喜上线!新增语音、音乐、视频和图片生成权益。邀请好友享双重好礼,助力开发体验! 好友立享 9折 专属优惠 Builder 权益,你赢返利 社区特权! 👉 立即参与:…...

告别SQL性能焦虑:教你如何解决

你是否遇到过这样的场景:一个看似复杂的SQL,在测试环境运行飞快,一到生产环境就“卡死”,一查执行计划,发现子查询生成了一个巨大的中间结果集,导致后续操作全部陷入性能泥潭?如果你正被此类场景…...

性能调优实战:数据库连接条件下推原理与案例拆解

文章目录引言一、问题背景1.1 客户场景中的典型痛点1.2 业界普遍面临的两大难点1.2.1 语义安全性(Equivalence)1.2.2 代价评估(Cost)二、传统方案的局限三、金仓数据库基于代价的连接条件下推设计3.1 能不能推:等价性判…...

Zed IDE新大招:Git 三合一 Picker,告别“找功能“焦虑症!

推荐阅读 Zed IDE 又整新活:确实比 VS Code 优雅丝滑! Zed IDE 又扔出了一个新玩具,确实比 VS Code 清新优雅! Zed 推出分栏 Diff :比 VSCode 更快、更智能的Git体验! Zed IDE 官宣ACP:一…...

LabVIEW后面板密码移除工具|支持全版本工程|一键清除保护密码

温馨提示:文末有联系方式工具核心功能:全版本LabVIEW后面板密码清除 本工具专为LabVIEW开发环境设计,可安全、稳定地清除LabVIEW VI文件的后面板保护密码。 全面兼容LabVIEW 2010至最新版2024,无论您使用的是32位或64位系统&#…...

告别复杂查询性能噩梦:一文读懂连接条件下推优化

摘要:金仓数据库(KingbaseES)的「基于代价的连接条件下推」技术解决了复杂SQL查询在生产环境中的性能瓶颈问题。该技术通过智能决策框架,先进行安全性检查确保语义等价,再基于代价模型评估下推收益,将连接条件智能下推到子查询中提…...

C语言写量子芯片驱动前必须做的7步接口压力测试:从单光子探测器误触发到多QPU并发访问崩溃的完整复现路径

第一章:C语言量子芯片接口测试的底层约束与物理边界C语言作为量子硬件接口层最广泛采用的系统编程语言,其与量子芯片(如超导量子处理器、硅基自旋量子点)的交互直接受限于物理层不可逾越的约束:纳秒级时序精度、亚毫伏…...

OJ前端页面开发

Markdown 编辑器 推荐的 Md 编辑器:https://github.com/bytedance/bytemd阅读官方文档,下载编辑器主体、以及 gfm(表格支持)插件、highlight 代码高亮插件 npm i bytemd/vue-next npm i bytemd/plugin-highlight bytemd/plugin-gf…...

梯形图转C后PLC宕机?别怪编译器!用这4个AST节点校验点+1张转换映射热力图,5分钟定位逻辑偏移根源

第一章:梯形图转C后PLC宕机?别怪编译器!用这4个AST节点校验点1张转换映射热力图,5分钟定位逻辑偏移根源当梯形图(LAD)经自动化工具转换为C代码部署至嵌入式PLC后突发宕机,多数工程师第一反应是质…...

大疆司空平台接入实战:OpenAPI无权限异常排查

前言 调用大疆司空 2 OpenAPI 接口时,很多开发者都会遇到 403 无权限异常 这个问题。本文基于实际项目排错经验,整理了完整的排查步骤,帮助你快速定位并解决问题。 403 错误是大疆 OpenAPI 开发中最常见的问题之一,据统计&#…...

100.【SV】SystemVerilog Interview Questions Set 1

📘 SystemVerilog 面试题集 1 —— 验证工程师的“知识快充” 在芯片验证面试中,面试官常常会考察你对 SystemVerilog 核心概念的理解。这些问题覆盖了从面向对象编程到并发控制,再到 DPI 等高级特性。今天,就来逐一解析这些常见面…...

现代智能汽车系统——三电2

2026年新能源汽车驱动电机技术呈现三大发展趋势:1.技术路线多元化,永磁同步电机(95%效率)仍为主流,励磁同步电机(无稀土依赖)成为欧洲新宠;2.核心技术创新,扁线绕组&…...

告别熬夜做 PPT:Paperzz AI PPT 生成器,15 分钟搞定毕业论文答辩全场景模板

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿/AI PPTpaperzz - AI PPT制作https://www.paperzz.cc/aiPpt 在毕业论文答辩的筹备流程中,PPT 往往是最容易被忽视却最关键的环节。很多毕业生花费数周打磨论文内容,却在制作答辩 PPT …...

结合Abaqus和Matlab建立理想的三维多晶模型:可自由选择模型尺寸和晶粒数量

结合abaqus和matlab建立理想的三维多晶模型,可自由选择模型尺寸和晶粒数量。在工程仿真领域,建立精确的模型是进行有效分析的关键。今天,我们来聊聊如何结合Abaqus和Matlab来构建一个理想的三维多晶模型。这种模型不仅可以根据需要自由选择尺…...

git 导出提交记录

git log develop --dateiso --prettyformat:"%h","%an","%ad","%s" --author作者 --since30 day ago > log.csvgit log 分支 --date时间格式 --pretty导出格式 --author作者 --since单引号内写导出时间 > 导出为 xx.csv\txt\log…...

程序员效率提升:IDEA 神级插件 + 配置,开发速度翻倍

从"重复搬砖"到"高效编码":IDEA 神级插件配置,开发速度直接翻倍 作为常年和IDEA打交道的后端开发者,我太懂那种被重复代码、格式问题、API调试拖慢节奏的痛苦。本文整理了我实测半年、能直接落地的7个神级插件6项核心配置…...

【仅限首批200家通过MCP 2026认证的企业可见】:OAuth 2026 FAPI-RW+eKYC联合认证沙箱实操——含FIDO2 attestation绑定与CIBA反向推送完整链路

第一章:【仅限首批200家通过MCP 2026认证的企业可见】:OAuth 2026 FAPI-RWeKYC联合认证沙箱实操——含FIDO2 attestation绑定与CIBA反向推送完整链路本章节面向已获准入资格的首批200家MCP 2026认证企业,提供OAuth 2026 FAPI-RW规范与eKYC身份…...