【FreeRTOS】源码概述

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

在这里插入图片描述

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

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

相关文章

【教程】从0开始搭建大语言模型:实现Attention机制

从0开始搭建大语言模型 从0开始搭建大语言模型:实现Attention机制建模长序列存在的问题使用attention机制获得数据间的依赖Self-attention介绍带有可训练权重的self-attention1.生成Q,K,V变量2.计算attention score3.attention weight的获得4…

PS2045L-ASEMI低Low VF肖特基PS2045L

编辑:ll PS2045L-ASEMI低Low VF肖特基PS2045L 型号:PS2045L 品牌:ASEMI 封装:TO-277 最大平均正向电流(IF):20A 最大循环峰值反向电压(VRRM):45V 最大…

Armbian OS(基于ubuntu24) 源码编译mysql 5.7

最近弄了个S905X3的盒子刷完Armbian OS (基于ubuntu24),开始折腾Arm64之旅。第一站就遇到了MySQL的问题,由于MySQL没有提供Arm64版本,又不想塞Docker镜像,因此选择源码来编译MySQL5.7。下面记录详细过程和遇…

马斯克的战略选择:特斯拉的H100显卡转移风波及其影响

引言 最近,一则关于马斯克将特斯拉的H100显卡转给他的新公司xAI的消息引发了广泛关注。这一决定不仅导致特斯拉股价下跌,还引发了关于马斯克战略决策的激烈讨论。本文将深入探讨这一事件的背景、过程及其对特斯拉和整个科技行业的影响。 背景与事件回顾…

8.transformers量化

Transformers 核心设计Auto Classes Transformers Auto Classes 设计:统一接口、自动检索 AutoClasses 旨在通过全局统一的接口 from_pretrained() ,实现基于名称(路径)自动检索预训练权重(模 型)、配置文件、词汇表等所有与模型相关的抽象。 灵活扩展的配置AutoConfig…

本地GPT-window平台 搭建ChatGLM3-6B

一 ChatGLM-6B 介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,新一代开源模型 ChatGLM3-6B 已发布,拥有10B以下最强的基础模型,支持工具调用(Function Call)、代码执行(Code Interpreter&…

【Python】成功解决ModuleNotFoundError: No module named ‘PyQt5‘

【Python】成功解决ModuleNotFoundError: No module named ‘PyQt5’ 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985…

c语言回顾-函数递归

1.递归的介绍 1.1什么是递归 递归是指在一个函数的定义中调用自身的过程。简单来说,递归是一种通过重复调用自身来解决问题的方法。 递归包括两个关键要素:基本情况和递归情况。基本情况是指当问题达到某个特定条件时,不再需要递归调用&am…

SpringBoot整合SpringDataRedis

目录 1.导入Maven坐标 2.配置相关的数据源 3.编写配置类 4.通过RedisTemplate对象操作Redis SpringBoot整合Redis有很多种,这里使用的是Spring Data Redis。接下来就springboot整合springDataRedis步骤做一个详细介绍。 1.导入Maven坐标 首先,需要导…

LLM应用实战:当图谱问答(KBQA)集成大模型(三)

1. 背景 最近比较忙(也有点茫),本qiang~想切入多模态大模型领域,所以一直在潜心研读中... 本次的更新内容主要是响应图谱问答集成LLM项目中反馈问题的优化总结,对KBQA集成LLM不熟悉的客官可以翻翻之前的文章《LLM应用实战:当KBQ…

弘君资本:苹果股价暴涨,创历史新高!

当地时间6月11日,美股三大指数涨跌纷歧,标普500指数与纳指再创新高。 到收盘,道指跌0.31%,纳指涨0.88%,标普500指数涨0.27%。 苹果大涨逾7%创前史新高。美联储开端召开6月货币方针会议,周三发布利率决定。…

传神论文中心|第11期人工智能领域论文推荐

在人工智能领域的快速发展中,我们不断看到令人振奋的技术进步和创新。近期,开放传神(OpenCSG)社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自的论…

如何进行电子故障失效分析FA?

在电子主板生产的过程中,一般都会出现失效不良的主板,因为是因为各种各样的原因所导致的,比如短路,开路,本身元件的问题或者是认为操作不当等等所引起的。 所以在电子故障的分析中,需要考虑这些因素&#x…

5.5 业务流程和业务逻辑设计

一、引言 1.1 项目背景 经过上述的论述,我们讨论一下业务流程和业务逻辑设计,通过合理的业务流程设计和业务逻辑设计,可以提高用户的购物体验,降低用户的操作成本,并确保用户的购物行为符合平台的规则和要求。同时&a…

旅游网页(HTML+CSS+JS)

前言 本篇博客就不给大家讲解了,直接上代码 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:https://blog.csdn.net/2302_78381559/category_12644031.html?spm1001.2014.3001.5482https://blog.csdn.net/2302_78381559/catego…

Linux防火墙管理

计算机防火墙用于保护内部网络,主机和网络安全,有硬件防火墙和软件防火墙两种,软件主要是用对数据包进行分析过滤来保证软件层面安全。 此外还有根据对数据封包形式确定的分类方法, 如代理服务器,类似网关的形式监控整…

Mcgs 屏幕Modbus RTU通讯调试

目录 1. 设备窗口1.1 添加设备构件1.2 设备配置1.2.1 通用串口父设备配置1.2.2 设备0--ModbusRTU配置2. 设计用户窗口2.1 关联设备通道与实时数据库2.3 用户窗口3. 通信测试本文想要实现通过Modbus协议与Mcgs屏幕进行通信收发数据。在使用Mcgs屏幕进行Modbus通信时,一般Mcgs屏…

如何完美解决 sun.security.validator.ValidatorException: PKIX path building failed

如何完美解决 sun.security.validator.ValidatorException: PKIX path building failed 博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的…

一种改进盲解卷积算法在旋转机械故障诊断中的应用(MATLAB)

滚动轴承故障形成后,故障区与其他零部件表面接触将产生循环平稳的瞬态脉冲。由于受到系统传递函数、轴转频和环境噪声的干扰,故障脉冲特征受到大幅衰减,在测得信号中表现十分微弱甚至完全不可见。盲解卷积算法通过搜索一个最优的有限脉冲响应…

“面向绿色流域构建的生态处理技术创新与实践论坛”在成都召开

由中华环保联合会、福州大学、上海大学联合主办,中华环保联合会水环境治理专业委员会、福建省环境功能材料先进技术工程研究中心、上海大学环境与化学工程学院承办的“2024全国水科技大会暨技术装备成果展览会”于5月14日在成都世纪城国际会议中心隆重开幕。 期间&a…