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

FreeRTOS工程项目实践

教程https://www.bilibili.com/video/BV1nvqSBAELQ

STM32F103 + Cube MX + FreeRTOS +面向对象+项目框架;

可维护性,高复用性;

高内聚,低耦合;

软件框架非常重要。

FreeRTOS任务调度

时间片轮转调度

抢占式调度

  • 相同优先级的任务,FreeRTOs采用时间片轮转调度,为每个任务分配1个单位时间片,顺序执行。
  • 不同优先级的任务,FreeRToS采用抢占式调度,高优先级任务优先执行,并且高优先级会打断低优先级任务。
  • 任务分为就绪态、运行态、阻塞态和挂起态
  • 调度器通过任务状态和优先级进行调度,其本质是PendsV 中断

如何撑爆FreeRTOS的堆栈

总堆(Total Heap)和任务栈(Task Stack)

  • 总堆:FreeRTOS 在程序编译时,会分配一块连续的内存,作为总堆。其本质是一个数组。可以使用pvPortMalloc()vPortFree()函数从中申请和释放内存。FreeRTOS 使用heap_1.c~heap_5.c来管理堆的分配。

  • 任务栈每个任务独立拥有,用于存放任务内的信息。当被打断或调用子函数时,需要保存现场,就把当前的任务信息压入栈中,下次恢复时再从栈中取出。压栈和出栈由系统自动操作,不需要手动管理。

    • 动态分配方式下,FreeRTOS 会从总堆中申请一块内存,作为任务栈;

    • 静态分配方式下,用户可以指定一块内存,作为任务栈。

FreeRTOS任务创建参数

如何查询当前任务堆栈使用情况

如何撑爆任务栈

1 定义大数组
任务切换时,需要保存现场,当前信息压入任务栈
2 嵌套调用函数
调用函数时,也需要保存现场,当前信息压入任务栈

优化

  • 按需分配任务栈(监控水位,留足余量)
  • 减少任务内的临时变量
  • 减少函数嵌套,嵌套都是有开销的

总堆空间不够,会发生什么?

消息队列

思考:任务之间如何传递消息

消息队列Queue

消息队列是 FreeRTOS 提供的一种通信机制,可以方便地实现任务与任务、中断与任务之间的通信。发送方只需要将信息发送到消息队列中,系统自动转交给接收方。

优势:
① 拷贝传递(非引用传递),保证信息完整,不会出现数据只写一半的情况
② 支持异步通知,发送不需要等待接收,代码解耦
③ 支持一对多、多对一、多对多通信
④ 系统级支持,可以实现阻塞任务操作
劣势:
① 依赖系统调用,时间和空间开销大

portmax_delay指的是队列满的时候一直等待,直到有了空位再写进去。

先进先出

实验

总结

任务之间、中断与任务间,可以使用全局变量和队列进行信息传递;
消息队列可以方便地阻塞任务,但是时间和空间开销比全局变量大;

消息队列在任务内和中断内要使用不同的函数;
为节省消息队列开销,可以在保证数据完整性的情况下传递指针;
队列大小要依据实际情况选择,太小会丢数据,太大会浪费内存。

信号量和优先级翻转问题

非互斥信号量分类

1 二值信号量

  • 本质是只有队列长度为 1,项大小为 0(空元素)的消息队列,故队列只有【空 (0)】和【满 (1)】两种状态,【空】表示事件还未发生,【满】表示事件已经发生。

  • 信号量【满 (1)】时,执行获取(Take)操作,成功后信号量值为 0【空 (0)】,执行释放(Give)操作无效。

  • 信号量【空 (0)】时,执行释放(Give)操作,成功后信号量值为 1【满 (1)】,执行获取(Take)操作会阻塞。


2 计数信号量

  • 本质是队列长度为计数最大值(uxMaxCount)的队列,内部最多有 uxMaxCount 个长度为 0 的元素(空元素)。

  • 每次获取(Take)信号量,则信号量值减 1,最小值为 0。

  • 每次释放(Give)信号量,则信号量值加 1,最大值为 uxMaxCount。


3 适用场景

  • 二值信号量适用于同步,如信号采集。

  • 计数信号量适用于资源管理,如图书馆剩余座位。


4 实验

  • 使用二值信号量,实现定时器中断控制板载 LED 闪烁。

  • 使用计数信号量,实现每按一个按键,亮一个灯;每松开一个按键,灭一个灯。

优先级翻转

1 互斥锁
本质:是一种支持优先级继承的二值信号量。
优先级继承机制:当高优先级任务尝试获取互斥信号量时,若该信号量已被低优先级任务占用,FreeRTOS 会将占用互斥信号量的任务优先级,提升至当前高优先级任务的优先级。
机制效果:优先级继承无法完全消除优先级翻转现象,但能降低已发生的优先级反转带来的影响(提升系统响应速度)。
使用限制:互斥信号量不可在中断中使用,因为中断无任务优先级,也不会被信号量阻塞。
2 递归互斥锁
本质:是一种特殊的互斥锁,同样支持优先级继承,且同样不可在中断中使用。
核心特性:允许同一个任务多次获取该锁;对应的,任务获取锁的次数必须与释放锁的次数完全一致,否则会导致资源无法释放。

信号量核心总结 💡

本质特性:信号量的本质是消息队列,但其中的元素均为空元素,不占用实际存储空间。
核心用途:
同步:协调任务的执行时机(解决 “什么时候执行” 的问题)
互斥:保护共享资源的访问权限(解决 “谁能执行” 的问题)
优先级翻转问题:
非互斥类信号量(如二值信号量、计数信号量)可能引发优先级翻转现象
互斥信号量无法完全避免优先级翻转,但可通过优先级继承机制降低该现象带来的负面影响,提升系统响应速度

http://www.jsqmd.com/news/494328/

相关文章:

  • 计算机毕设 java 美文推荐系统 Java+SpringBoot 美文推荐分享平台 Web 版美文博文交流网站
  • 基于计算机视觉的万物识别模型性能优化策略
  • 2026年口碑好的电热风炉厂家推荐:矿用电热风炉/井口防冻电热风炉源头工厂推荐 - 品牌宣传支持者
  • Unity开发次世代写实手游开发大纲
  • leetcode 困难题 1406. Stone Game III 石子游戏 III
  • sql性能分析和sql优化
  • Matlab实用指南:一键运行15种回归基础模型全家桶,涵盖ANN、RNN等高级模型,中文注释...
  • StructBERT文本相似度模型在网络安全中的应用:恶意文本与钓鱼内容识别
  • 2026年质量好的纸尿裤公司推荐:婴儿纸尿裤/内裤式纸尿裤/粘贴式纸尿裤生产厂家推荐 - 品牌宣传支持者
  • 2026 SiteGround 官网人工在线客服聊天指南
  • eNSP web方式防火墙透明模式配置
  • 高通 QCS8550 边缘智能实践:基于 Qwen2.5-7B 与 Agent+RAG 构建本地化知识助手
  • leetcode 1408. String Matching in an Array 数组中的字符串匹配-耗时100
  • c++基础+类和对象
  • 基于单矢量控制的永磁同步电机模型预测电流控制Simulink仿真模型 对应学习资料: 1
  • 文墨共鸣模型效果惊艳展示:多风格长文本创作集锦
  • 团队协作只能靠“在线文档”?大错特错!2026 年企业网盘“硬核协作”能力横评
  • 27.3k stars!Fish Speech:开源 TTS 的天花板,10 秒克隆任意声音!
  • 家庭网络小白必看:为什么你的手机和电脑能直接传文件?揭秘同一网段通信的底层逻辑
  • SAP Fiori Launchpad 全景解析:从统一入口到角色化工作台,再到移动端落地实践
  • 题解:P11062 【MX-X4-T2】「Jason-1」加法
  • Grok‑3‑Fast 落地选型与部署方案
  • Asian Beauty Z-Image Turbo实战:如何用结构化提示词生成有故事感的东方人像
  • Excel 实战技巧:利用 OFFSET 统计 “标识行” 下方的数值总和
  • 二叉树的构造、合并与二叉搜索树
  • message-api(WebSocket)消息推送:持久/非持久、已读回写、未读重推全链路解析(含双 Kafka、Redis、TiDB、BloomFilter)
  • 基于改进蛇优化算法(GOSO/ISO)优化极限梯度提升树的数据回归预测(GOSO/ISO-XG...
  • yz-bijini-cosplay多模态实践:文本到图像生成效果展示
  • 为什么你的 Agent 总是“断片”?
  • 密码安全那些事:从明文到 SHA-256 到 BCrypt,为什么一步步升级