FreeRTOS通俗理解指南:基础概念 + 架构+ 内核组件+练手实验

article/2025/7/6 0:42:44

RTOS 基础概念

想象一下,你是一个忙碌的厨师,在厨房里同时要完成煎牛排和煮意大利面两项任务。

1.传统单线程模式(没有RTOS)

如果你只能按顺序一项一项地做,就会是这样的过程:

  • 先煎一会儿牛排
  • 然后去看看意大利面煮得怎么样
  • 再回来煎牛排

如果煎牛排的过程比较复杂,需要频繁翻面和控制火候,那么意大利面就可能会煮过头。反之,如果一直盯着意大利面,牛排就可能煎糊了。这种方式就类似于传统的单片机开发,没有使用操作系统,任务之间相互影响,效率较低

用代码来表示就是:

2.使用 RTOS 的多任务模式

当引入 RTOS 后,就可以 “同时” 进行多项任务。你可以这样安排:

  • 启动一个 “煎牛排任务”,让它自己在那里煎着
  • 同时启动一个 “煮意大利面任务”,让它也自己煮着
  • 你只需要在适当的时候去查看一下每个任务的进度,比如每隔一会儿去给牛排翻个面,或者看看意大利面有没有煮好

这样,牛排和意大利面都能在合适的时间完成,而且不会相互干扰。这就是 RTOS 的基本概念,它可以让单片机同时处理多个任务,提高系统的效率和实时性。

RTOS 的全称是 Real-time operating system,即实时操作系统。与我们日常使用的 Windows 等通用操作系统不同,RTOS 更注重实时性,能够确保任务在规定的时间内完成。例如,在一个工业控制系统中,如果某个传感器的数据采集任务不能及时完成,可能会导致整个系统的失控。

下面是一个简单的 RTOS 程序示例,用 C 语言编写:

在这个示例中,我们创建了两个任务:Task_FrySteak 和 Task_CookPasta。每个任务都有自己的独立运行逻辑,通过 vTaskDelay 函数来控制任务的执行时间间隔。xTaskCreate 函数用于创建任务,vTaskStartScheduler 函数用于启动任务调度器,开始调度各个任务的执行。

FreeRTOS 简介

为什么选择 FreeRTOS

在众多的 RTOS 中,FreeRTOS 是一个非常受欢迎的选择,它有以下几方面优点:

  • 开源免费:FreeRTOS 是开源的,任何人都可以免费使用和修改,这对于降低开发成本非常有帮助。
  • 轻量级:它的内核非常小巧,占用的资源很少,适合在资源有限的单片机上运行。
  • 实时性好:FreeRTOS 提供了高效的任务调度算法,能够确保任务在规定的时间内完成,满足实时性要求。
  • 易于使用:FreeRTOS 提供了丰富的 API 函数,易于学习和使用。同时,它还支持多种硬件平台,包括 ARM、RISC-V 等常见的架构。

FreeRTOS 的架构

FreeRTOS 的架构可以分为以下几个层次:

1.硬件抽象层(HAL)

这一层负责与硬件进行交互,包括处理器、内存、外设等。它提供了一些基本的函数,如中断处理、时钟管理等,使得 FreeRTOS 能够在不同的硬件平台上运行。

2.内核层

这是 FreeRTOS 的核心部分,包括任务调度器、内存管理、信号量、互斥量等组件。任务调度器负责决定哪个任务应该在当前时刻运行,内存管理组件负责分配和释放内存,信号量和互斥量用于任务之间的同步和通信。

3.应用层

这一层是用户编写的应用程序,包括各种任务和函数。用户可以根据自己的需求创建和管理任务,使用 FreeRTOS 提供的 API 函数来实现各种功能。

FreeRTOS 内核组件详解

1.堆内存管理

FreeRTOS 提供了多种堆内存管理方案,用户可以根据自己的需求选择合适的方案。常见的堆内存管理方案包括:

  • 简单分配器:这种方案简单易用,但内存利用率较低,可能会产生内存碎片。
  • 最佳适配分配器:这种方案能够更好地利用内存,减少内存碎片的产生,但实现相对复杂一些。

2.任务管理

任务是 FreeRTOS 中最基本的执行单元。FreeRTOS 支持多任务,每个任务都有自己的优先级和堆栈空间。任务可以处于以下几种状态之一:

  • 运行态:当前正在执行的任务。
  • 就绪态:任务已经准备好运行,但由于其他任务正在运行,暂时无法执行。
  • 阻塞态:任务因为等待某个事件(如信号量、消息队列等)而暂停执行。
  • 挂起态:任务被挂起,暂时不会被调度执行。

3.队列管理

队列是 FreeRTOS 中用于任务之间通信的重要机制。任务可以通过队列发送和接收数据,实现数据的共享和传递。队列具有以下特点:

  • 先进先出(FIFO):数据按照发送的顺序依次被接收。
  • 支持中断安全:可以在中断服务程序中安全地使用队列。

4.软件定时器

软件定时器是 FreeRTOS 提供的一种定时机制,它可以在指定的时间间隔后触发一个回调函数。软件定时器可以用于实现一些周期性的任务,如数据采集、系统监控等。

5.中断管理

中断是单片机中非常重要的机制,它可以让 CPU 及时响应外部事件。FreeRTOS 提供了对中断的支持,用户可以在中断服务程序中调用 FreeRTOS 的 API 函数,实现任务的切换和通信。

6.临界区

临界区是指一段代码,在这段代码执行期间,不允许其他任务或中断打断。FreeRTOS 提供了进入和退出临界区的函数,用户可以在需要保护的代码段前后调用这些函数,确保代码的原子性。

7.互斥量

互斥量是一种用于保护共享资源的机制,它可以确保在同一时刻只有一个任务能够访问共享资源。FreeRTOS 提供了互斥量的实现,用户可以通过获取和释放互斥量来控制对共享资源的访问。

8.守门任务

守门任务是一种特殊的任务,它可以用于控制对某些资源的访问。只有当守门任务允许时,其他任务才能访问这些资源。

9.事件组

事件组是一种用于任务之间同步的机制,它可以让一个任务等待多个事件的发生。任务可以通过设置和清除事件组中的事件来通知其他任务。

10.任务通知

任务通知是一种轻量级的任务间通信机制,它可以让一个任务向另一个任务发送通知。任务通知可以用于实现一些简单的任务间同步和通信。

FreeRTOS 实验部分

为了帮助读者更好地理解和掌握 FreeRTOS 的使用方法,我们的课程提供了丰富的实验内容。实验部分采用了两种不同的开发板:华清远见STM32F103 和 STM32F407,并分别使用了 MDK-ARM 和 STM32CubeIDE 两种集成开发环境。

在实验中,我们将逐步引导初学者完成以下内容:

使用 STM32CubeMX 配置 FreeRTOS:通过图形化界面快速配置 FreeRTOS 的各项参数,生成初始化代码。

创建和管理任务:学习如何创建、启动、停止和删除任务,以及如何设置任务的优先级和堆栈大小。

使用队列和信号量进行任务间通信:了解如何通过队列和信号量实现任务之间的数据传递和同步。

使用软件定时器和中断:掌握软件定时器和中断的使用方法,实现周期性任务和外部事件的响应。

内存管理和性能优化:学习如何优化内存使用,提高系统的性能和稳定性。

通过这些实验,让初学者深入了解 FreeRTOS 的工作原理和使用方法,掌握如何在实际项目中应用 FreeRTOS 来开发高效、稳定的实时系统。

总之FreeRTOS 是一款功能强大、易于使用的实时操作系统,它为单片机开发提供了丰富的功能和高效的任务管理机制。通过学习 FreeRTOS,读者可以掌握实时系统的开发方法,提高自己的编程能力和解决实际问题的能力。

在我们的《嵌入式体系课:STM32全栈工程师实战课》里有专门的FreeRTOS课程(如下图红框),课程全面覆盖FreeRTOS基础与使用、任务创建方法、任务参数使用、任务的优先级、相对延时函数、队列、定时器等,通过理论讲解、案例分析和实验操作相结合的方式,帮助用户深入理解 FreeRTOS 的架构和应用。无论你是初学者还是有一定经验的开发者,都能从课程中获得有益的知识和技能,为自己的嵌入式学习奠定坚实的基础。

全套课程收看链接

嵌入式体系课程:STM32嵌入式系统开发

https://www.yyzlab.com.cn/package/info/1760588296396795905?code=66


http://www.hkcw.cn/article/jpiVisYaKO.shtml

相关文章

端午最全攻略!景点、天气、交通三件套

端午假期去哪玩?各地文旅放大招如何既能体验传统文化又能玩得轻松不踩坑?这份攻略请收好!端午假期去哪玩?端午假期各地文旅放大招端午主题活动丰富多彩部分景区还推出节日优惠政策北京北京推出1700余场活动,与广大市民游客共享初夏好时节。1700余场活动具体戳详情>>…

【DAY34】GPU训练及类的call方法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前…

干泵,干式螺杆真空泵

干式真空泵: 无油干式机械真空泵(又简称干式机械泵)是指泵能从大气压力下开始抽气,又能将被抽气体直接排到大气中去,泵腔内无油或其他工作介质,而且泵的极限压力与油封式真空泵同等量级或者接近的机械真空泵…

day 26 函数专题

一、函数的基本写法 def function_name(parameter1, parameter2, ...):"""Docstring: 描述函数的功能、参数和返回值 (可选但强烈推荐)"""# 函数体: 实现功能的代码# ...return value # 可选,用于返回结果def 关键字:用于…

目标检测学习

RCNN 默认找出2000个可能存在目标的候选区域 region proposal将候选区域调整为适合AlexNet网络的输入图像的大小,通过CNN对候选区域提取特征向量,2000个建议区域经过Alexnet生成20004096的特征矩阵将20004096的特征向量经过20个类别的svm分类器进行分类&…

谷歌Gemma模型实现智能看病、翻译手语、与海豚沟通

目录 引言:AI的新篇章——从通用走向专属的智慧革命 一、 MedGemma:智能医疗的守护者与革新者 1.1 MedGemma的双重火力 1.2 高效部署与开发者生态 1.3 未来展望 二、SignGemma:跨越无声世界的沟通桥梁 2.1 SignGemma的核心能力 2.2 从…

TDengine 运维——巡检工具(定期检查)

背景 TDengine 在运行一段时间后需要针对运行环境和 TDengine 本身的运行状态进行定期巡检,本文档旨在说明如何使用巡检工具对 TDengine 的运行环境进行自动化检查。 安装工具使用方法 工具支持通过 help 参数查看支持的语法 Usage: taosinspect [OPTIONS]Check…

火语言UI组件--地图

【组件功能】:调用高德地图api,可通过定义经纬度定位显示具体位置。 样式预览 设置 基础设置 属性名称属性释义输入值类型开发者Key(key)高德地图 JSAPI 开发者Key字符串类型安全密钥(securityJsCode)高德地图 JSAPI 安全密钥字符串类型缩放级别(zoom)设置地图缩…

安防通信枢纽新贵:HT-CKNU 网络报警服务器深度解析

在安防体系不断升级的当下,报警服务器作为连接前端设备与接警中心的关键枢纽,其性能优劣直接关乎安全防护的成效。HT-CKNU 网络报警服务器凭借卓越的技术架构、广泛的兼容性和便捷的操作体验,正逐渐成为安防行业的中流砥柱,为各领…

打通仿真数据孤岛,实现精细化权限管理,「共享空间」深度解析

在上一期《资深仿真工程师必备!详解平台“控制中枢”——「命令终端」》中,我们详解了如何通过命令行实现作业高效提交与资源调度。然而,工业仿真从来不是单兵作战——复杂模型的多方协作、海量数据的跨团队流转,才是研发场景的常…

桌面工具站

桌面工具站软件,可以将桌面软件、word文档和网页等拖拽到工具站,在工具站点击直接跳转,方便快捷。 可以拖拽进入软件,也可以迪纳基添加,添加界面如下: 支持自定义排序 可自定义背景,效果如下; 支…

人工智能编程学习心得:从零基础到独立开发的蜕变之路

引言:一场改变认知的技术之旅 2022年冬天,我在深夜的办公室里经历了第一次深度学习模型的完整训练过程。当GPU使用率曲线从波动到平稳,当验证集准确率突破85%的那一刻,显示器的蓝光映照着满桌的咖啡杯,这个场景成为我…

Docker 与 Serverless 架构:无服务器环境下的容器化部署

Serverless(无服务器)架构作为云计算领域的革命性范式,以其无需管理服务器、按需付费、自动伸缩的特性,正在改变着应用开发和部署的方式。然而,传统的函数即服务(Function-as-a-Service, FaaS),如 AWS Lambda,在运行时环境、部署包大小和复杂依赖管理方面存在一定的局…

SI24R05国产低功耗2.4GHz+125K低频唤醒SoC人员定位/畜牧业牛羊定位/资产管理定位方案芯片

目录 SI24R05简介功能框图 主要特性开发工具方案特性 SI24R05简介 Si24R05 是一款高度集成的低功耗 SOC 芯片,具有低功耗、Low Pin Count、 宽电压工作范围,集成了 13/14/15/16 位精度的 ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、无线收发器、…

Apptrace:APP安全加速解决方案

2021 年,某知名电商平台在 “618” 大促期间遭遇 DDoS 攻击,支付系统瘫痪近 2 小时;2022 年,一款热门手游在新版本上线时因 CC 攻击导致服务器崩溃。观察发现,电商大促、暑期流量高峰和年末结算期等关键商业周期&#…

AI生态警报:MCP协议风险与应对指南(中)——MCP Server运行时安全​​

作为连接AI模型与外部工具的“USB-C接口”,MCP协议成为AI生态的核心枢纽,其安全风险已从理论威胁转化为实际攻击目标。 AI生态警报:MCP协议风险与应对指南(上)——架构与供应链风险https://blog.csdn.net/WangsuSecur…

黑河流域30弧秒分辨率月尺度地表水及地下水灌溉量数据集(1981-2013)

时间分辨率&#xff1a;月空间分辨率&#xff1a;< 0.01共享方式&#xff1a;开放获取数据大小&#xff1a;573.97 MB数据时间范围&#xff1a;1981-01-13 — 2014-01-12元数据更新时间&#xff1a;2021-04-19 数据集摘要 农业灌溉占人类用水量的80%左右, 是人类水资源管理…

反对内卷式恶性竞争 中国汽车工业协会发布倡议

反对“内卷式”恶性竞争 中国汽车工业协会发布重要倡议记者从中国汽车工业协会获悉,针对行业“内卷式”竞争,协会发布重要倡议,企业不应采取无序“价格战”,应维护公平竞争秩序。协会提出的四项倡议包括:一是所有企业严格遵从公平竞争原则,依法依规开展经营活动;二是优势…

时间序列数据如何转化为动态图实践笔记

文章目录 1 时间序列的状态的定义2 时序转化的实际案例解析2.1 步骤一&#xff1a;数据准备与特征提取2.2 步骤二&#xff1a;状态识别与节点构建2.3 步骤三&#xff1a;演化状态图构建2.4 步骤四&#xff1a;图神经网络&#xff08;GNN&#xff09;建模2.5 配套代码实践 看到 …

对COM组件的调用返回错误 HRESULT E_FAIL

方法1 网上的加载DLL到缓存&#xff0c;我通过GPT写了个批处理 1.bat 放到 Common7\IDE\PublicAssemblies 下 2. 添加环境变量 Path 按这个&#xff0c;DLL加入了缓存 但是 VS创建MFC项目还是失败 方法2&#xff1a;项目创建失败了&#xff0c;其实这个项目已经创建出来了…