FreeRTOS源码概述
FreeRTOS源码概述
1 FreeRTOS目录结构
使用 STM32CubeMX 创建的 FreeRTOS 工程中,FreeRTOS 相关的源码如下:

主要涉及2个目录:
- Core
- Inc 目录下的 FreeRTOSConfig.h 是配置文件
- Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务
- Middlewares\Third_Party\FreeRTOS\Source
- 根目录下是核心文件,这些文件是通用的
- portable 目录下是移植时需要实现的文件
2 核心文件
FreeRTOS的最核心文件只有2个:
- FreeRTOS/Source/tasks.c
- FreeRTOS/Source/list.c
将其他的文件以及作用也一并列出如下:
| FreeRTOS/Source/下的文件 | 作用 |
|---|---|
| tasks.c | 必需,任务操作 |
| list.c | 必须,列表 |
| queue.c | 基本必需,提供队列操作、信号量操作 |
| timer.c | 可选,software timer |
| event_groups.c | 可选,提供 event group 功能 |
| croutine.c | 可选,过时了 |
3 移植时涉及的文件
移植FreeRTOS时涉及的文件放在FreeRTOS/Source/portable/[compiler]/[architecture]目录下,比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS或Keil工具上的移植文件。
里面有2个文件:
- port.c
- portmacro.h
4 头文件相关
4.1 头文件目录
FreeRTOS需要3个头文件目录:
-
FreeRTOS 本身的头文件:
Middlewares\Third_Party\FreeRTOS\Source\include -
移植时用到的头文件:
Middlewares\Third_Party\FreeRTOS\Source\portable[compiler][architecture] -
含有配置文件 FreeRTOSConfig.h 的目录:Core\Inc
4.2 头文件
| 头文件 | 作用 |
|---|---|
| FreeRTOSConfig.h | FreeRTOS 的配置文件,比如选择调度算法: configUSE_PREEMPTION每个 demo 都必定含有FreeRTOSConfig.h 建议去修改 demo 中的 FreeRTOSConfig.h,而不是从头写一个 |
| FreeRTOS.h | 使用 FreeRTOS API 函数时,必须包含此文件。 在 FreeRTOS.h 之后,再去包含其他头文件,比如: task.h、queue.h、semphr.h、event_group.h |
5 内存管理
文件在 Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang 下,它也是放在“portable”目录下,表示你可以提供自己的函数。
| 文件 | 优点 | 缺点 |
|---|---|---|
| heap_1.c | 分配简单,时间确定 | 只分配、不回收 |
| heap_2.c | 动态分配、最佳匹配 | 碎片、时间不定 |
| heap_3.c | 调用标准库函数 | 速度慢、时间不定 |
| heap_4.c | 相邻空闲内存可合并 | 可解决碎片问题、时间不定 |
| heap_5.c | 在 heap_4 基础上支持分隔的内存块 | 可解决碎片问题、时间不定 |
6 入口函数
在 Core\Src\main.c 的 main 函数里,初始化了 FreeRTOS 环境、创建了任务,然后启动调度器。源码如下:
/* Init scheduler */osKernelInitialize(); /* 初始化FreeRTOS运行环境 */MX_FREERTOS_Init(); /* 创建任务 *//* Start scheduler */osKernelStart(); /* 启动调度器 */
7 数据类型和编码规范
7.1 数据类型
每个移植的版本都含有自己的portmacro.h头文件,里面定义了2个数据类型:
-
TickType_t:
- FreeRTOS 配置了一个周期性的时钟中断:Tick Interrupt
- 每发生一次中断,中断次数累加,这被称为 tick count
- tick count 这个变量的类型就是 TickType_t
- TickType_t 可以是 16 位的,也可以是 32 位的
- FreeRTOSConfig.h 中定义 configUSE_16_BIT_TICKS 时,TickType_t 就是 uint16_t
- 否则 TickType_t 就是 uint32_2
- 对于 32 位架构,建议把 TickType_t 配置为 uint32_t
-
BaseType_t:
- 这是该架构最高效的数据类型
- 32 位架构中,它就是 uint32_t
- 16 位架构中,它就是 uint16_t
- 8 位架构中,它就是 uint8_t
- BaseType_t 通常用作简单的返回值的类型 ,还有逻辑值 ,比 如 pdTRUE/pdFALSE
7.2 变量名
| 变量名前缀 | 含义 |
|---|---|
| c | char |
| s | int16_t,short |
| l | int32_t,long |
| x | BaseType_t,其他非标准的类型:结构体、task handle、queue handle等 |
| u | unsigned |
| p | 指针 |
| uc | uint8_t,unsigned char |
| pc | char 指针 |
7.3 函数名
函数名的前缀有2部分:返回值类型、在哪个文件定义。
| 函数名前缀 | 含义 |
|---|---|
| vTaskPrioritySet | 返回值类型:void 在 task.c 中定义 |
| xQueueReceive | 返回值类型:BaseType_t 在 queue.c 中定义 |
| pvTimerGetTimerID | 返回值类型:pointer to void 在 tmer.c 中定义 |
7.4 宏
宏的名字是大写,可以添加小写的前缀。前缀是用来表示:宏在哪个文件中定义。
| 宏的前缀 | 含义:在哪个文件里定义 |
|---|---|
| port (比如 portMAX_DELAY) | portable.h 或 portmacro.h |
| task (比如 taskENTER_CRITICAL()) | task.h |
| pd (比如 pdTRUE) | projdefs.h |
| config (比如configUSE_PREEMPTION) | FreeRTOSConfig.h |
| err (比如 errQUEUE_FULL) | projdefs.h |
通用的宏定义如下:
| 宏 | 值 |
|---|---|
| pdTRUE | 1 |
| pdFALSE | 0 |
| pdPASS | 1 |
| pdFAIL | 0 |
相关文章:
FreeRTOS源码概述
FreeRTOS源码概述 1 FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中,FreeRTOS 相关的源码如下: 主要涉及2个目录: Core Inc 目录下的 FreeRTOSConfig.h 是配置文件Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Mi…...
日志统计(C++,模拟,双指针)
题目要我们求在某个时间段中,帖子点赞数达到K的帖子数 遍历方式一 我们可以先对所有帖子根据时间,升序排序 枚举每一条帖子,枚举后续每一条帖子,如果id相同且时间差小于d,那么就记录起来,如果记录数量cn…...
加固脱壳技术:DEX动态加载对抗
1. 加固技术原理剖析 1.1 DEX保护演进路线 加固方案发展历程: graph LR A[2015 代码混淆] --> B[2017 DEX动态加载] B --> C[2019 VMP指令虚拟化] C --> D[2022 全链路加密] 1.1.1 主流加固方案对比 厂商核心防护技术弱点分析梆梆加固DEX文件分片…...
C++之list类(超详细)
在上一节中我们学习了STL中的vector这个容器,这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…...
强化学习的一些概念
目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习(Reinforcement Learning, RL)是机器学习的一个分支,旨在让智能体(Agent)通过与环境的交互学习最优策略,以…...
MambaTab:表格数据处理的新利器
——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab,一种基于结构化状态空间模型(SSM)的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构,MambaTab在普通监督学习和特征增量学习场景中均表现优异&…...
Kafka的流量控制机制
Kafka的流量控制机制 Kafka 作为一款高吞吐量的消息队列系统,能够在海量数据场景下提供稳定的消息生产和消费能力,其背后的流量控制机制功不可没。我们需要认识到,Kafka 的流量控制并非仅仅是为了防止系统过载或崩溃,它的目标是实…...
RabbitMQ支持的复杂的消息交换模式
RabbitMQ支持多种复杂的消息交换模式,这些模式通过不同的交换机类型和队列特性实现,能够满足多样化的业务需求。以下是RabbitMQ支持的主要复杂消息交换模式: 1. Direct Exchange(直连交换机) 直连交换机根据消息的路由…...
CSSHTML新特性
HTML5 新特性探秘 在 Web 开发的不断演进中,HTML5 带来了一系列令人振奋的新特性,极大地提升了网页的功能和用户体验。今天,我们就来深入探究一下这些新特性。 语义化标签:让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…...
51单片机的工作方式
目录 一、51 单片机的时钟电路及时钟信号 (一)时钟电路 (二)时钟信号 二、51 单片机的CPU 时序 (一)时钟周期 (二)机器周期 (三)指令周期 三、…...
Java算法OJ(12)
目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖,今天来分享几道的练习题,欢迎大家在评论区多多交流,废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目:斐波那契数列_牛客题霸…...
MrRobot靶机详细解答
一、主机发现 arp-scan -l二、端口扫描、目录枚举、指纹识别 2.1端口扫描 nmap -p- 192.168.55.147发现22端口关闭,且无其它特殊端口,只能去网页中寻找信息 2.2目录枚举 dirb http://192.168.55.1472.3指纹识别 nmap 192.168.55.147 -sV -sC -O --…...
java线性表(单向链表)
对于链表我们有很多种,有带头和不带头,双向和单项,循环和不循环。 我们实现的单向链表是不带头单向不循环链表。 链表不比顺序表,它可以连续也可以不连续,是链子型的每条链子两边都有节点(除首尾)。 单向…...
QT:动态属性和对象树
动态对象 1.添加Q_PROPERTY对象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…...
编程语言的几种常见的分类方法
一、 按照编程范式分类 命令式编程语言 强调通过语句来改变程序状态,如 C、Pascal、Fortran 等。 面向对象编程语言 基于对象和类的概念,支持封装、继承和多态,如 Java、C、Python、Ruby 等。 函数式编程语言 注重不可变性和纯函数…...
算法——层序遍历和中序遍历构造二叉树
晴问 #include <iostream> #include <vector> #include <queue> #include <unordered_map>using namespace std;struct TreeNode {int data;TreeNode *left;TreeNode *right;TreeNode(int data) : data(data), left(nullptr), right(nullptr) {} };//…...
中考英语之06语态(动词语态-简单)
1 主动语态和被动语态 在初中英语中,语态是动词的一种形式,用于说明主语与谓语动词之间的关系,主要有主动语态和被动语态两种。 1.1 主动语态 定义:表示主语是动作的执行者。结构:主语 谓语(及物动词&a…...
linux常用基础命令_最新
常用命令 查看当前目录下个各个文件大小查看当前系统储存使用情况查看当前路径删除当前目录下所有包含".log"的文件linux开机启动jar更改自动配置文件后操作关闭自启动linux静默启动java服务查询端口被占用查看软件版本重启关机开机启动取别名清空当前行创建文件touc…...
PH热榜 | 2025-03-16
1. BrowserAgent 标语:基于浏览器的人工智能代理 - 无限使用,固定费用 介绍:在您的浏览器中直接创建和运行AI工作流程,无需支付API费用。我们的可视化编辑器不需要编写代码,同时我们的浏览器本地技术支持以固定价格进…...
《论语别裁》第01章 学而(27) 无所适从的礼俗
下面讲做学问的态度。 有子曰:礼之用,和为贵,先王之道,斯为美,小大由之;有所不行,知和而和,不以礼节之,亦不可行也。 为什么讲学问讲到礼?这个礼,…...
关于进程的实验(子进程和父进程相关的)
文章目录 1.第一个问题2.第二个问题3.第三个问题 1.第一个问题 编写一段程序,利用系统调用fork( )创建两个进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显…...
《基于视频监控的智能跌倒检测系统》开题报告
一、本课题研究目标 本课题旨在研究并实现一个基于视频监控的智能跌倒检测系统,以有效识别老年人或需特殊照顾人群的跌倒事件,并实现自动报警功能。具体而言,该系统将通过机器学习和深度学习技术,对视频数据中的行为模式进行分析&…...
Flask中的装饰器
在 Flask 中,装饰器(Decorator)是一种 Python 语法特性,它允许你在不修改原始函数的情况下,扩展其功能。Flask 使用装饰器来定义路由、请求前后钩子、中间件等。 1. Flask 装饰器的基本概念 Python 的装饰器本质上是一…...
MySQL配置文件my.cnf详解
目前使用的服务器系统是CentOS8.5 ,针对MySql8.4的配置示例,自己根据实际情况修改。 安装MySql8.4时,MySql8.4没有默认的my.cnf,需要用户根据需要自行配置my.cnf文件,大概可看到下面这样的参数列表,可能不同版本的mysql参数多少会…...
SonarQube安装及结合IDEA使用详细教程(2025适配版)
一、环境验证与准备 JDK版本确认 PS C:\> java -version openjdk version "17.0.14" 2025-01-21 LTS OpenJDK Runtime Environment Zulu17.5615-CA (build 17.0.147-LTS) OpenJDK 64-Bit Server VM Zulu17.5615-CA (build 17.0.147-LTS)安装路径说明 主程序路径&a…...
2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题E卷
目录 总体规划 模块二:设备基础信息配置 模块三:网络搭建与网络冗余备份方案部署 模块四:移动互联网搭建与网优 模块五:出口安全防护与远程接入 总体规划 医院在进行网络部分信息化建设方案设计过程中,需要保证医院、血液中心通过社保网进行互连互通,同时满足献血中心与医…...
python列表基础知识
列表 创建列表 1.列表的定义:可变的,有序的数据结构,可以随时添加或者删除其中的元素 2.基本语法:字面量【元素1,元素2,元素3】使用[]创建列表 定义变量:变量名称【元素1,元素2&…...
vue echarts封装使用
echarts 尺寸自动调节 resize.js 柱状图 components/dashboard/lineChart.vue <template><div :class"className" :style"{height:height,width:width}" /> </template><script> import echarts from echarts require(echarts/…...
PTP协议赋能高精度时间同步网络
什么是PTP? PTP(精确时间协议,Precision Time Protocol) 是一种基于IEEE 1588标准的网络时间同步协议,旨在为分布式系统中的设备提供亚微秒级(甚至纳秒级)的高精度时钟同步。其核心目标是通过消…...
使用WireShark解密https流量
概述 https协议是在http协议的基础上,使用TLS协议对http数据进行了加密,使得网络通信更加安全。一般情况下,使用WireShark抓取的https流量,数据都是加密的,无法直接查看。但是可以通过以下两种方法,解密抓…...
