FreeRTOS通俗理解指南:基础概念 + 架构+ 内核组件+练手实验
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
相关文章:

FreeRTOS通俗理解指南:基础概念 + 架构+ 内核组件+练手实验
RTOS 基础概念 想象一下,你是一个忙碌的厨师,在厨房里同时要完成煎牛排和煮意大利面两项任务。 1.传统单线程模式(没有RTOS) 如果你只能按顺序一项一项地做,就会是这样的过程: 先煎一会儿牛排然后去看看…...
Python后端开发实战:从0到1搭建高可用API服务
引言 Python凭借其简洁的语法和丰富的生态(如Django、Flask、FastAPI等框架),已成为后端开发的主流语言之一。本文将结合一个真实电商API项目,分享从架构设计到部署上线的完整流程,并总结开发过程中常见的坑与最佳实践。 一、实战案例:电商API开发流程 1.1 技术选型 框…...

房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块
房屋租赁系统 JavaVue.jsSpringBoot,包括房屋信息、看房申请、租赁合同、房屋报修、收租信息、维修数据、租客管理、公告管理模块 百度云盘链接:https://pan.baidu.com/s/16YRGBPsfbd4_HxXhO0jM5Q 密码:smk4 摘 要 房屋是人类生活栖息的重要…...
4、ubuntu系统 | 文本和目录操作函数
1、目录操作函数 ls(列出目录内容) 用途:列出指定目录中的文件和子目录。语法:ls [选项] [路径]常用选项: -l:以长格式显示文件详细信息(权限、所有者、大小、时间等)。-aÿ…...
docker部署ELK,ES开启安全认证
ES启动命令 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:8.17.0 es启动之后需要进入es容器,重置密码 elasticsearch-reset-password -u elastic -i 重置后的密码配置到kibana.yml中,启动kibana docker run …...

ASP.NET MVC添加视图示例
ASP.NET MVC高效构建Web应用- 商品搜索 - 京东 视图(V)是一个动态生成HTML页面的模板,它负责通过用户界面展示内容。本节将修改HelloWorldController类,并使用视图模板文件,以干净地封装生成对客户端的HTML响应的过程…...
自动驾驶中的路径跟踪:Python实现与技术解析
自动驾驶中的路径跟踪:Python实现与技术解析 一、路径跟踪是什么?为什么它至关重要? 路径跟踪(Path Tracking)是自动驾驶系统的关键部分之一,它负责确保车辆能够沿着预定义的轨迹行驶,同时稳定控制转向角度和速度。一个好的路径跟踪算法需要具备以下特点: 精准度:能…...
前端面试题目-高频问题集合
1.CSS里面水平垂直居中的方法 1.CSS里面水平垂直居中的方法弹性布局display: flex; /*先开启flex布局*/justify-content: center; /*实现水平居中*/jalign-items: center; /*实现垂直居中*/网格布局display: grid; /*先开启grid布局*/plac…...
MyBatis源码解析:从 Mapper 接口到 SQL 执行的完整链路
MyBatis源码解析:从 Mapper 接口到 SQL 执行的完整链路 一、Mapper 代理对象的创建:sqlSession.getMapper(UserMapper.class)二、接口方法的执行:mapper.selectUser("coderzpw", 18)2.1 四大核心组件解析2.1.1 Executor(…...

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)
📅 我们继续 50 个小项目挑战!—— FormWave组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 🎯 组件目标 构建一个美观、动态的登录表单࿰…...

双目相机深度的误差分析(基线长度和相机焦距的选择)
全文基于针孔模型和基线水平放置来讨论 影响双目计算深度的因素: 1、基线长度:两台相机光心之间距离2、相机焦距(像素): f x f_x fx(或 f y f_y fy)为焦距 f f f和一个缩放比例的乘积。在…...

Pytorch Geometric官方例程pytorch_geometric/examples/link_pred.py环境安装教程及图数据集制作
最近需要训练图卷积神经网络(Graph Convolution Neural Network, GCNN),在配置GCNN环境上总结了一些经验。 我觉得对于初学者而言,图神经网络的训练会有2个难点: ①环境配置 ②数据集制作 一、环境配置 我最初光想…...

React---day6、7
6、组件之间进行数据传递 **6.1 父传子:**props传递属性 父组件: <div><ChildCpn name"蒋乙菥" age"18" height"1,88" /> </div>子组件: export class ChildCpn extends React.Component…...

hook组件-useEffect、useRef
hook组件-useEffect、useRef useEffect 用法及执行机制 WillMount -> render -> DidMount ShouldUpdate -> WillUpdate -> render -> DidUpdate WillUnmount(只有这个安全) WillReceiveProps useEffect(callback) 默认所有依赖都更新useEffect(callback, [])&am…...
功能结构整理
C# Sxer Sxer.Base:基础子功能 Sxer.Base.Debug:打印 Sxer.Utility:工具类 Sxer.CustomFunction:独立功能点开发 Unity...
企业级开发中的 maven-mvnd 应用实践
1. 引言:Maven 在企业级开发中的挑战 1.1 Maven 构建的常见痛点 在大型 Java 项目中,Maven 是主流的构建工具,但随着项目的复杂度增加,其性能瓶颈逐渐显现: 构建速度慢:每次执行 mvn clean install 都需要重新加载插件和依赖。重复构建浪费资源:即使未修改源码,仍会触…...
yolov12毕设前置知识准备 1
1 什么是目标检测呢? 目标检测(Object Detection)主要用于识别图像或视频中特定类型物体的位置,并标注其类别。 简单来说,就是让计算机像人类一样 “看懂” 图像内容,不仅能识别出物体(如人、…...

随机游动算法解决kSAT问题
input:n个变量的k-CNF公式 ouput:该公式的一组满足赋值或宣布没有满足赋值 算法步骤: 随机均匀地初始化赋值 a ∈ { 0 , 1 } n a\in\{0,1\}^n a∈{0,1}n.重复t次(后面会估计这个t): a. 如果在当前赋值下…...

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡
《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡 第一节 从康盛创想到腾讯收购:PC时代的辉煌 1.1 Discuz! 的诞生:康盛创想的开源梦想 2001年,中国互联网正处于萌芽阶段,个人网站和论坛开始兴起。…...
azure web app创建分步指南系列之一
什么是 Azure Web 应用? Azure Web 应用是 Azure 应用服务的一部分,是一个完全托管的平台,用于开发、部署和扩展 Web 应用程序。它支持各种编程语言和框架,例如 .NET、Java、Python、PHP 和 Node.js,使开发人员能够构建强大的 Web 应用程序,而无需担心底层基础架构。借助…...
PyTorch实战——基于生成对抗网络生成服饰图像
PyTorch实战——基于生成对抗网络生成服饰图像 0. 前言1. 模型分析与数据准备2. 判别器3. 生成器4. 模型训练5. 模型保存与加载相关链接0. 前言 我们已经学习了生成对抗网络 (Generative Adversarial Network, GAN) 的工作原理,接下来,将学习如何将其应用于生成其他形式的内…...

笔试强训:Day6
一、小红的口罩(贪心优先级队列) 登录—专业IT笔试面试备考平台_牛客网 #include<iostream> #include<queue> #include<vector> using namespace std; int n,k; int main(){//用一个小根堆 每次使用不舒适度最小的cin>>n>&…...
【Hexo】4.Hexo 博客文章进行加密
安装 npm install --save hexo-blog-encrypt1-快速使用 将“ password”添加到您的文章信息头就像这样: password: 123456 ---2-按标签加密 1.修改文章信息头如下: title: Hello World tags: - 加密文章tag date: 2020-03-13 21:12:21 password: muyiio…...
Android --- ObjectAnimator 和 TranslateAnimation有什么区别
文章目录 2. 作用范围和功能2. 动画表现3. 是否修改 View 的属性4. 适用场景5. 性能总结: ObjectAnimator 和 TranslateAnimation 都是 Android 中常用的动画类型,但它们有以下几个关键的区别: 2. 作用范围和功能 ObjectAnimator:…...
小白的进阶之路系列之四----人工智能从初步到精通pytorch自定义数据集下
本篇涵盖的内容 在之前的文章中,我们已经讨论了如何获取数据,转换数据以及如何准备自定义数据集,本篇文章将涵盖更加深入的问题,希望通过详细的代码示例,帮助大家了解PyTorch自定义数据集是如何应对各种复杂实际情况中,数据处理的。 更加详细的,我们将讨论下面一些内容…...
安卓添加设备节点权限和selinux访问权限
# 1 修改设备节点权限及配置属性设置节点值 ## 1.1 修改设备节点权限 ### 1.1.1 不会手动卸载的节点 在system/core/rootdir/init.rc中添加节点权限 在on boot下面添加 chown system system /sys/kernel/usb/host chmod 0664 /sys/kernel/usb/host ### 1.1.2 支持热插拔的…...

谷歌Stitch:AI赋能UI设计,免费高效新利器
在AI技术日新月异的今天,各大科技巨头都在不断刷新我们对智能工具的认知。最近,谷歌在其年度I/O开发者大会期间,除了那些聚光灯下的重磅发布,还悄然上线了一款令人惊喜的AI工具——Stitch。这是一款全新的、完全免费的AI驱动UI&am…...

运营商地址和ip属地一样吗?怎么样更改ip属地地址
在互联网时代,IP属地和运营商地址是两个经常被提及的概念,但它们是否相同?如何更改IP属地地址?这些问题困扰着许多网民。本文将深入探讨这两个概念的区别,并详细介绍更改IP属地地址的方法。 一、运营商地址和IP属地一…...

在QT中,利用charts库绘制FFT图形
第1章 添加charts库 1.1 .pro工程添加chart库 1.1.1 在.pro工程里面添加charts库 1.1.2 在需要使用的地方添加这两个库函数,顺序一点不要搞错,先添加.pro,否则编译器会找不到这两个.h文件。 第2章 Charts关键绘图函数 2.1 QChart 类 QChart 是…...
ChatGPT + 知网 + 知乎,如何高效整合信息写出一篇专业内容?
——写作,不是闭门造车,而是高效聚合 🧠 为什么“信息整合力”才是AI时代的核心写作能力? 现在的写作,不缺工具,也不缺资料,缺的是: 把 scattered info 变成 structured idea 的能力…...