FreeRTOS学习(十七)——优先级翻转与优先级继承
上一节学习了互斥量Mutex它可以保护共享资源保证同一时刻只有一个任务能够访问串口、LCD、Flash等资源。但是如果多个不同优先级的任务同时竞争一个互斥量就可能产生一个比较隐蔽的问题——优先级翻转Priority Inversion。这一节学习什么是优先级翻转以及FreeRTOS是如何利用**优先级继承Priority Inheritance**解决这一问题的。这也是嵌入式软件工程师面试中经常出现的知识点。一、什么是优先级翻转假设系统中有三个任务Task_H 高优先级3Task_M 中优先级2Task_L 低优先级1其中Task_L首先获得了互斥量Mutex开始访问串口。此时Task_H也需要访问串口。但是Mutex已经被Task_L占用因此Task_H ↓ 等待Mutex按理来说只需要等待Task_L执行完释放互斥量即可。但是Task_M此时变为就绪态。由于Task_M 优先级 Task_L于是CPU开始执行Task_M而Task_L一直得不到CPU。结果就是Task_H ↓ 等待Task_L ↓ Task_L又一直被Task_M抢占最终高优先级任务 反而等待低优先级任务。这就是优先级翻转二、优先级翻转过程整个过程可以表示为Task_L 获得Mutex ↓ Task_H需要Mutex ↓ Task_H阻塞 ↓ Task_M开始运行 ↓ Task_L没有机会运行 ↓ Mutex一直不能释放 ↓ Task_H持续等待可以看到真正阻塞高优先级任务的不是Task_L而是Task_M这也是优先级翻转最容易让人困惑的地方。三、为什么优先级翻转危险假设Task_H负责电机控制而Task_M只是LED闪烁如果发生优先级翻转LED任务 一直抢占CPU ↓ 电机控制一直等待显然是不合理的。在实时系统中高优先级任务 必须尽快得到CPU。因此必须解决优先级翻转问题。四、什么是优先级继承FreeRTOS互斥量支持Priority Inheritance即优先级继承。它的思想很简单当Task_H等待Mutex而Mutex被Task_L占有时。FreeRTOS会暂时把Task_L的优先级提升为Task_H的优先级。例如原来Task_L Priority 1现在自动变成Priority 3这样Task_M Priority 2就不能抢占Task_L了。五、优先级继承过程加入优先级继承以后Task_L获得Mutex ↓ Task_H等待Mutex ↓ Task_L优先级提升 ↓ Task_L继续运行 ↓ 释放Mutex ↓ Task_L恢复原优先级 ↓ Task_H立即运行整个过程中Task_M不会再影响Task_H等待互斥量。因此优先级翻转被解决。六、代码示例创建互斥量SemaphoreHandle_t Mutex; Mutex xSemaphoreCreateMutex();任务1void LowTask(void *pvParameters) { while(1) { xSemaphoreTake( Mutex, portMAX_DELAY ); printf(Low Task\r\n); vTaskDelay(pdMS_TO_TICKS(2000)); xSemaphoreGive(Mutex); vTaskDelay(pdMS_TO_TICKS(1000)); } }任务2void HighTask(void *pvParameters) { while(1) { xSemaphoreTake( Mutex, portMAX_DELAY ); printf(High Task\r\n); xSemaphoreGive(Mutex); vTaskDelay(pdMS_TO_TICKS(500)); } }程序运行过程中如果LowTask已经获得互斥量。随后HighTask请求同一个互斥量。FreeRTOS会自动进行优先级继承。整个过程不需要用户手动修改优先级。七、为什么二值信号量不能解决很多初学者容易认为二值信号量 ↓ 也能锁资源。事实上二值信号量 没有优先级继承。因此如果使用xSemaphoreCreateBinary();保护共享资源。发生优先级翻转以后。FreeRTOS不会自动提高低优先级任务的优先级。所以保护共享资源 推荐使用Mutex 不要使用Binary Semaphore。八、什么时候会发生优先级翻转通常需要满足三个条件第一多个任务优先级不同。第二多个任务共同访问同一个共享资源。第三共享资源采用互斥机制保护。例如USART SPI I2C Flash SD卡这些都是实际工程中经常发生优先级翻转的地方。九、实际工程建议互斥量虽然能够解决优先级翻转但仍然要尽量缩短Take ↓ Give之间的代码。例如xSemaphoreTake(); printf(); xSemaphoreGive();是合理的。但是xSemaphoreTake(); vTaskDelay(5000); xSemaphoreGive();则不建议这样写。因为任务长时间占有互斥量会增加其他任务等待时间降低系统实时性。因此共享资源保护范围越小越好互斥量占用时间越短越好。十、总结这一节学习了FreeRTOS中的优先级翻转与优先级继承。当高优先级任务等待低优先级任务占有的互斥量而低优先级任务又被中优先级任务抢占时就会发生优先级翻转。FreeRTOS互斥量支持优先级继承机制能够临时提高持有互斥量任务的优先级使其尽快释放共享资源从而减少高优先级任务的等待时间。因此需要牢记二值信号量用于任务同步。互斥量用于共享资源保护。互斥量具有优先级继承而二值信号量没有。

相关新闻

从玩具到工程:M型模型车底盘调校与电子系统实战指南

从玩具到工程:M型模型车底盘调校与电子系统实战指南

1. 从“玩具”到“工程”:M型模型车的真实世界 提到“M型模型车”,很多人的第一反应可能是商场里、玩具店货架上那些色彩鲜艳、造型炫酷的遥控车。没错,从广义上讲,任何以“M”为设计特征或系列代号的模型车,都可以归入…

2026/10/5 15:14:45 阅读更多 →
解决ftsrch.dll丢失问题的安全修复指南

解决ftsrch.dll丢失问题的安全修复指南

1. 问题背景:ftsrch.dll文件丢失的典型场景 最近帮同事处理电脑故障时,发现一个高频出现的系统错误提示:"无法启动此程序,因为计算机中丢失ftsrch.dll"。这个看似简单的dll文件缺失问题,实际上可能引发一系列…

2026/10/2 9:39:34 阅读更多 →
Shader学习25:织物 之 天鹅绒

Shader学习25:织物 之 天鹅绒

一、关于布料表现布料表面不是光滑的,是无数根细小纤维竖立着传统的微表面brdf更适用于致密表面,但对于松散结构的布料 缺少了一些真实布料的特征,因为表面的纤维会吸收、散射入射光。边缘光照效果》Sheen 环:织物在掠射角时出现的…

2026/9/28 5:10:26 阅读更多 →

最新新闻

VAR模型与Stata实操:从时间序列分析到论文实证

VAR模型与Stata实操:从时间序列分析到论文实证

1. VAR模型入门:为什么论文里它如此常见最近几年,经济金融类论文里出现频率最高的计量模型,向量自回归(VAR)绝对算一个。不管是宏观政策效应评估、股价与宏观变量的动态关系,还是行业间的溢出效应&#xff…

2026/10/13 18:57:02 阅读更多 →
C++全量编译从40分钟到5分钟:ccache与sccache缓存加速实战

C++全量编译从40分钟到5分钟:ccache与sccache缓存加速实战

刚接手这个C项目的时候,最让我头疼的倒不是代码历史包袱,而是全量编译一次要等足足四十分钟。项目体量不算夸张,真实业务代码也就几百个编译单元,但牵扯到Protobuf、Boost这类重型依赖,每次clean build都像一次长途旅行…

2026/10/13 18:57:02 阅读更多 →
Python内存泄漏排查实战:引用计数、垃圾回收与gc模块用法

Python内存泄漏排查实战:引用计数、垃圾回收与gc模块用法

很多写Python的朋友都有过这种经历:线上服务跑了几天,内存占用从几百MB一路涨到几个GB,最后被运维盯上,开会点名要看排查报告。我也遇到过,而且不止一次。第一反应是加机器、重启进程,但治标不治本。直到我…

2026/10/13 18:57:02 阅读更多 →
Flutter EventBus原理与工程实践:解耦跨组件通信

Flutter EventBus原理与工程实践:解耦跨组件通信

1. 为什么在Flutter里还要用EventBus?原生机制真不够用吗?刚接触Flutter的开发者常会困惑:Dart本身有Stream、Future,Widget树有InheritedWidget、Provider、Riverpod这些状态管理方案,官方文档也反复强调“不要过早引…

2026/10/13 18:57:02 阅读更多 →
Windows进程后台运行原理与CE精准干预技术

Windows进程后台运行原理与CE精准干预技术

1. 这个标题背后的真实技术图谱:不是“挂机”,而是进程级资源调度控制“CE实现植物大战僵尸后台运行”——看到这个标题,很多人第一反应是“挂机刷金币”“自动种豆子”,甚至联想到某些灰色外挂工具。但作为在游戏逆向与系统底层调…

2026/10/13 18:57:02 阅读更多 →
卡尔曼滤波器从一维到EKF:机器人状态估计实战笔记

卡尔曼滤波器从一维到EKF:机器人状态估计实战笔记

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 18:56:01 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →