FreeRTOS源码分析

目录

1、FreeRTOS目录结构

2、核心文件

3、移植时涉及的文件

4、头文件相关

4.1 头文件目录

4.2 头文件

5、内存管理

6、入口函数

7、数据类型和编程规范

7.1 数据类型

7.2 变量名

7.3 函数名

7.4 宏的名


1、FreeRTOS目录结构

使用 STM32CubeMX 创建的 FreeRTOS 工程中,FreeRTOS 相关的源码如下:

主要涉及2个目录:

  • Core
    • Inc 目录下的 FreeRTOSConfig.h 是配置文件
    • Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务
  • Middlewares\Third_Party\FreeRTOS\Source
    • 根目录下是核心文件,这些文件是通用的
    • portable 目录下是移植时需要实现的文件
      • 目录名为:[compiler]/[architecture]
      • 比如:RVDS/ARM_CM3,这表示 cortexM3 架构在 RVDS 工具上的移植文件

2、核心文件

FreeRTOS的最核心文件只有2个:

  • FreeRTOS/Source/tasks.c
  • FreeRTOS/Source/list.c

其他文件的作用也一起列表如下:

3、移植时涉及的文件

移植FreeRTOS时涉及的文件放在 FreeRTOS/Source/portable/[compiler]/[architecture] 目录下, 比如:RVDS/ARM_CM3,这表示cortexM3架构在RVDS或Keil工具上的移植文件。

里面包含两个文件:

  • 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”目录下,表示你可以提供自己的函数。

源码中默认提供了5个文件,对应内存管理的5种方法。

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_t
    • 对于 32 位架构,建议把 TickType_t 配置为 uint32_t
  • BaseType_t:
    • 这是该架构最高效的数据类型
    • 32 位架构中,它就是 uint32_t
    • 16 位架构中,它就是 uint16_t
    • 8 位架构中,它就是 uint8_t
    • BaseType_t通常用简单的返回值的类型,还有逻辑值,比如 pdTRUE/pdFALSE

7.2 变量名

变量名前缀含义
cchar
sint16_t,short
Iint32_t,long
x

BaseType_t,

其他非标准的类型:结构体、task handle、queue handle

uunsigned
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/725348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu服务器搭建Git远程仓库

本文所述方法适用于小型团队在局域网环境中使用Git进行代码版本管理。 1. 安装Git 打开终端(Ctrl + Alt + T) ,输入以下命令: sudo apt update #更新软件包列表信息 sudo apt install git #安装Git 验证Git是否安装成功,可以查看Git版本: git --version 也需…

shell中的流程控制

条件判断在流程控制中的重要性 有了条件判断才能进行if判断即分支流程,才能进行case的多分支流程,才能进行for循环和while循环。 单分支流程判断 如上图所示,在shell编程中常使用英文状态下的分号来在Linux控制台一次性执行多条命令&#x…

无线领夹麦克风哪个牌子好用?一文揭秘哪种领夹麦性价比最高!

​无线领夹麦克风,无疑是现代音频技术的杰出代表。它摆脱了传统有线麦克风的束缚,让声音的传播更加自由、灵活。无论是追求极致音质的音乐爱好者,还是需要高效沟通的商务人士,无线领夹麦克风都能满足你的需求,让你的声…

513、找二叉树左下角的值

题解:层序遍历简单,此篇记录递归法,要注意左下角的值并不一定是左叶子节点,遍历思路形象化就是按先左后右的顺序遍历每一条分支,若遍历到叶子结点,看此时深度有没有超过之前的值,超过了就记录下…

Jlink下载固件到RAM区

Jlink下载固件到RAM区 准备批处理搜索exe批处理调用jlink批处理准备jlink脚本 调用执行 环境:J-Flash V7.96g 平台:arm cortex-m3 准备批处理 搜索exe批处理 find_file.bat echo off:: 自动识别脚本名和路径 set "SCRIPT_DIR%~dp0" set &qu…

TIME_WAIT的危害

前言 该文章主要讨论下TIME_WAIT的存在意义和潜在危害,以及解决措施。 具体内容 首先看一下下面这幅图 这幅图来自《TCP IP详解卷1:协议 原书第2版中文》TCP状态变迁图。 TIME_WAIT存在意义 可靠的终止TCP连接。 保证让迟来的TCP报文有足够的时间被…

数据库 | 试卷四

1.数据库系统的特点是 数据共享、减少数据冗余、数据独立、避免了数据不一致和加强了数据保护 2.关系模型的数据结构是二维表结构 3.聚簇索引 cluster index 4. 这里B,C都是主属性,所以B->C不是非主属性对码的部分函数依赖 候选键(AC&a…

光电液位传感器在净水器领域的应用优势有哪些?

光电液位传感器作为一种先进的液位检测技术,在净水器领域有着显著的应用优势。具有高精度的特点,能够精确地检测水位变化,保证水处理过程的稳定性和效率。 传统的浮球式传感器可能存在精度偏差或者在长期使用中需要维护和更换的问题&#xf…

nginx+tomcat负载均衡、动静分离群集【☆☆☆☆☆】

Nginx是一款非常优秀的HTTP服务器软件,性能比tomcat更优秀,它支持高达50 000个并发连接数,拥有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低。目前很多大型网站都应用Nginx服务器作为后端网站程序的…

机器学习课程复习——隐马尔可夫

不考计算题 Q:概率图有几种结构? 条件独立性的公式? 顺序结构发散结构汇总结构Q:隐马尔可夫模型理解? 概念 集合:状态集合、观测集合 序列:状态序列、观测序列

你不知道的MySQL备份和还原技巧,速来学习!

01、mysql备份数据库 1、mysql备份单个数据库 #mysql备份某个库格式: mysqldump -h主机名 -P端口 -u用户名 -p"密码" --database 数据库名 > 文件名.sql#实例:mysql备份某个库: mysqldump -h10.*.*.9 -P3306 -uroot -p"密…

闹大了!高考作文“人工智能与AI”引发争议,专家喊话,部分考生家长无奈,直呼:“太不公平了!这哪里是考作文,分明是在考城乡差距啊!”

闹大了!高考作文“人工智能与AI”引发争议,专家喊话,部分考生家长无奈,直呼:“太不公平了!这哪里是考作文,分明是在考城乡差距啊!” ​高考,本该是最公平的战场&#xff…

leetcode21 合并两个有序单链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 [] 输出:[]示例…

YOLOv10改进 | 主干篇 | YOLOv10引入华为VanillaNet替换Backbone

1. VanillaNet介绍 1.1 摘要: 基础模型的核心是“越多越好”的理念,计算机视觉和自然语言处理领域取得的惊人成功就是例证。 然而,优化的挑战和变压器模型固有的复杂性要求范式向简单性转变。 在这项研究中,我们介绍了 VanillaNet,一种设计优雅的神经网络架构。 通过避免…

【Docker系列】深入解析 Docker 容器部署脚本

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Shardingsphere-Proxy 5.5.0部署

Shardingsphere-Proxy 5.5.0部署 Shardingsphere系列目录:背景下载安装包Linux解压安装包修改配置文件global.yamldatabase-sharding.yaml配置没有单表情况配置有单表的情况背景 引入数据库驱动启动代理连接代理数据库Navicate工具连接MYSQL客户端连接 Shardingsphe…

华为IPD体系中三大流程之IPD流程的六个阶段和七个评审点介绍

概念 IPD集成产品开发,英文是IntegratedProduct Development,是一整套科学的研发创新管理方法论,将产品经营管理思想和理念置入到新产品开发和产品管理过程中,因此IPD是不仅是一套研发管理体系,更是一套产品经营管理体…

浸没式液冷服务器的换热效率及节能潜力分析

服务器浸没式液冷的换热效率及节能潜力 摘要:我们针对服务器浸没式液冷实验台进行了深入测试,探究了不同室外温度和服务器发热功率对系统制冷PUE的影响。实验数据显示,该系统的制冷PUE值介于1.05至1.28之间,高效节能特点显著。 在…

报表控件Stimulsoft 图表轴的日期时间步长模式

Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能,Stimulsoft Ultimate包含了…

83. 删除排序链表中的重复元素

文章目录 题目解题思路代码 题目 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2] 示例 2: 输入&#xff1…