【FreeRTOS】源码概述

news2024/11/24 0:38:44

FreeRTOS源码概述

参考《FreeRTOS入门与工程实践(基于DshanMCU-103)》里《第7章 FreeRTOS源码概述》
相关文章:http://t.csdnimg.cn/QK0aO

1 FreeRTOS目录结构

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

目录结构
主要设计两个目录

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

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

FreeRTOS/Source/下的文件作用
tasks.c必需,任务操作
list.c必须,列表
queue.c基本必需,提供队列操作、信号量(semaphore)操作
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.hFreeRTOS 的配置文件,比如选择调度算法: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种方法。

文件优点缺点
heap_1.c分配简单,时间确定只分配、不回收
heap_2.c动态分配、最佳匹配碎片、时间不定
heap_3.c调用标准库函数速度慢、时间不定
heap_4.c相邻空闲内存可合并可解决碎片问题、时间不定
heap_5.c在 heap_4 基础上支持分隔的内存块可解决碎片问题、时间

heap_1 只分配 不回收,一点都不浪费空间

在这里插入图片描述

heap_2 既分配又释放
在这里插入图片描述
假设buf1是申请了100个字节,有头部,buf2是申请了50个字节,也有头部~

假设释放buf1和buf2,这两块内存是紧密相连的,但是它不能合并到一起,buf1仍然最大能分配100字节,buf2仍然是最大能分配50字节,假设buf3把最后面的内存都用完了,现在再想分配120字节的空间,用heap2这种方法就没有办法分配了!原因&缺点:它没有把空闲的紧密相连的空间合并在一起,所以有严重的碎片问题。

heap_3一般不用,调用标准库

heap_4 既分配又释放, heap_4在heap_2的基础上做了一些改进,heap_4合并相邻的空闲内存

针对heap_2的缺点,如果我们再想分配120字节的空间,那就是可以的了,因为buf1的100字节和buf2的50字节合并起来了!

heap_5 用来支持分隔的内存

两块红色的就是分隔的内存,可以用heap_5来管理
在这里插入图片描述
空闲链表头,指向第一个堆,再指向第二个堆,我们需要告诉链表头,有多少个离散的堆

一般的都是用heap_4

6 入口函数

在 Core\Src\main.c 的 main 函数里,初始化了 FreeRTOS 环境、创建了任务,然后启动
调度器。源码如下:

/* Init scheduler */
osKernelInitialize(); /* 初始化FreeRTOS运行环境 */
MX_FREERTOS_Init(); /* 创建任务 */
/* Start scheduler */
osKernelStart(); /* 启动调度器 */

7 数据类型和编程规范

FreeRTOS有一套自己的编程规范

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
lint32_t, long
XBaseType_t,其他非标准的类型:结构体、task handle、queue handle 等
uunsigned
p指针
ucuint8 t, unsigned char
pcchar 指针

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

通用的宏定义如下:

pdTRUE1
pdFALSE0
pdPASS1
pdFAIL0

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第2章 Rust初体验2/8:变量值绑定:默认不可变增强代码安全性:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.3.6 变量值绑定:默认不可变增强代码安全性 赵可菲:“那句给 guess 赋值的,没特别写出类型来,看起来Rust是自动帮我们搞定类型判断的吧。” let mut guess = String::new();贾克强:“对啊,Rust会自动帮我们做类型推断(type inference),这…

Linux 基本指令1

ls指令 ls【-选项】【目录或文件】当不指定目录或文件时指令能列出当前目录下所有文件除隐藏文件 选项: -a 列出所有包括隐藏的文件-隐藏文件以.开头。 -d 将目录如文件般显示-一般用ls显示目录是显示其目录中所有文件,加-d则显示目录的信息 -r 以反…

【数据结构】单链表(C语言)

在数据结构和算法中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C语言中,我们可以使用指针来实现单向链表。下面将详细讲述如何利用C语言实现单向链表。 1.单链表的概念和结构 概…

C++发送邮件的性能如何优化?有哪些方法?

C发送邮件怎么配置SMTP服务器?如何使用C库发信? 在现代应用程序中,电子邮件发送是一个常见的功能。尤其对于需要发送大量邮件的企业级应用,优化邮件发送性能变得尤为重要。AokSend将探讨在使用C发送邮件时,如何通过各…

电脑想加个WIFI功能,怎么选!

在快速发展的物联网和智能家居时代,Wi-Fi模块作为连接各类智能设备与互联网的桥梁,其重要性不言而喻。而为了让这些模块能够适应各式各样的应用场景,不同的接口技术应运而生。今天,我们就来深入浅出地探讨几种常见的Wi-Fi模块接口,包括它们的工作原理、特点以及适用场景,…

Docker以挂载方式安装RocketMQ

Docker 挂载安装RocketMQ Docker 挂载安装RocketMQ安装 Docker安装NameServer1.拉取容器2.创建NameServer容器3.查看容器状态 安装 broker创建 broker.conf 文件启动容器 安装RocketMQ-console构建镜像启动容器开通安全组策略访问控制台 Docker 挂载安装RocketMQ 在 Docker 中…

LangChain入门学习笔记(二)——LangChain表达式语言(LCEL)

基于LangChain框架编写大模型应用的过程就像垒积木,其中的积木就是Prompts,LLMs和各种OutputParser等。如何将这些积木组织起来,除了使用基本Python语法调用对应类的方法,一种更灵活的方法就是使用位于LangChain-Core层中的LCEL&a…

python的四个进度条

哈喽,我是快乐吗喽,今天简单的给大家介绍一下python的四个进度条工具,希望各位喜欢。 第一个进度条工具tqdm,好记点我叫她淘气大妈 安装tqdm库 pip install tqdm 基本用法 from tqdm import tqdm import timefor i in tqdm(ran…

SpringBoot2+Vue3开发课程审核流程系统

SpringBoot2Vue3开发课程审核流程系统 简介 此系统实现了课程审核全流程功能并使用了Activiti7工作流技术,功能包含:课程管理、用户管理、流程定义、课程审核(我的申请、我的代办、我的已办) 功能介绍 课程管理 对课程信息的管…

录音转文字软件:一键让工作学习更高效

在职场这个大舞台上,每一场会议都是关键的演出,而会议记录就是这场演出的剧本。但剧本要整理得好,才能让演出更精彩,不是吗? 把那些长串的会议音频变成清晰的文字记录,听起来就像变魔术一样难。但不用担心…

人工智能强化学习:核心内容、社会影响及未来展望

欢迎来到 Papicatch的博客 文章目录 🐋引言 🐋强化学习的核心内容 🦈强化学习基本概念 🐋强化学习算法 🦈Q学习(Q-Learning) 🦈深度Q网络(Deep Q-Network, DQN&…

AI日报|苹果生态全面整合AI功能,字节跳动被曝秘密启动AI手机研发

文章推荐 粽叶飘香,端午安康!AI视频送祝福啦~ 谁是最会写作文的AI“考生”?“阅卷老师”ChatGPT直呼惊艳! ⭐️搜索“可信AI进展“关注公众号,获取当日最新AI资讯 苹果WWDC 2024:AI为苹果带来了什么&am…

24年系统架构设计师考试真题大放送

哈喽,简单介绍一下,我是研究系统架构设计师/系统分析师考试3 年,累计帮助千人备考系统架构设计师的——凯恩。芝士架构刷题免费!芝士架构 | 软考备考第一站 这周,凯恩抽空把2024年系统架构设计师真题的选择题&#xff…

【qt】视口和窗口坐标

视口和窗口坐标 一.视口和窗口坐标的原理二.视口和窗口坐标的好处三.演示好处四.总结 一.视口和窗口坐标的原理 在绘图事件中进行绘图 void Widget::paintEvent(QPaintEvent *event) {QPainter painter(this);QRect rect(200,0,200,200);painter.drawRect(rect);//设置视口的…

Vue3学习日记(day3)

目录详解: 简单解释: 详细解释: .vscode public assets compents router views app.vue package.json package-lock.json 区别 探究文档 应用配置​ 语法合集 插值表达式​ V- HTML(易造成xss漏洞)​…

2024世界人工智能大会“SAIL奖”发布

作为世界人工智能大会的最高奖项,SAIL 奖(Super AI Leader,卓越人工智能引领者)坚持“追求卓越、引领未来”的理念,评选和运营秉持“高端化、国际化、专业化、市场化、智能化”原则,从全球范围发掘在人工智…

VS2019+QT5.15调用动态库dll带有命名空间

VS2019QT5.15调用动态库dll带有命名空间 vs创建动态库 参考: QT调用vs2019生成的c动态库-CSDN博客 demo的dll头文件: // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL3_EXPORTS // 符号…

品牌渠道管控的风险与要点

品牌在管控渠道时,不仅要注重方法和效果,还得留意风险,以免被误解为“垄断”。在与品牌接触和服务过程中,我们整理出完善且合规的治理方法供品牌参考。先简单分享品牌控价的知识点。 价格管控指的是品牌对渠道低价、乱价情况的管理…

Vue 路由:一级路由,嵌套路由

1、安装路由插件,因为用的是vue2 所以路由版本要和vue2对应上,所有有3 yarn add vue-router3 2、在main.js里引入 import VueRouter from vue-router Vue.use(VueRouter) 3、新建文件夹 router,创建index.js 4、引入路由插件,并且暴露出来这个路由 5、在…

【OpenCV】CUDA讲解(一)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享关于CUDA的知识,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进步&#xf…