news 2026/8/28 6:02:15

#112_东山笔记_关于FreeRTOS移植树文件的内容说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
#112_东山笔记_关于FreeRTOS移植树文件的内容说明

推荐FreeRTOS教程

链接一:FreeRTOS官网
链接二:百问网FreeRTOS教程
链接三:百问网移至文件

1. 核心源文件(Source 根目录)

这些文件是 FreeRTOS 内核的通用实现,与具体硬件无关,因此放在Source根目录下,所有移植版本共用。

文件作用为什么放在这里
tasks.c任务管理:创建、删除、延时、调度、优先级管理内核最核心的功能,与硬件无关
list.c链表数据结构实现,内核内部使用(就绪链表、延时链表等)纯软件数据结构,与硬件无关
queue.c队列、信号量、互斥量的实现内核同步机制,与硬件无关
timers.c软件定时器实现依赖 tick,但本身逻辑与硬件无关
event_groups.c事件组实现内核同步机制,与硬件无关
croutine.c协程(Co-routine)实现(可选,已较少使用)与硬件无关
stream_buffer.c流缓冲区(Stream Buffer)实现与硬件无关
message_buffer.c消息缓冲区(Message Buffer)实现(基于流缓冲区)与硬件无关

为什么这些文件放在 Source 根目录?
因为它们只依赖 C 语言和 FreeRTOS 内部接口,不直接操作寄存器或特定硬件。放在根目录可以避免重复,所有工程共享同一份代码。

2. 移植相关文件(portable 目录)

portable目录下按[compiler]/[architecture]分子目录,例如RVDS/ARM_CM3

文件作用为什么放在这个子目录
port.c实现硬件相关的底层操作:上下文切换、启动第一个任务、SysTick 中断处理、临界区进入/退出这些操作依赖具体 CPU 架构和编译器,必须为每种组合单独实现
portmacro.h定义硬件相关的数据类型(如TickType_tBaseType_t)、临界区宏、上下文切换相关的宏port.c,与架构和编译器强相关

为什么按[compiler]/[architecture]分目录?
不同编译器(RVDS、IAR、GCC)的内联汇编、符号修饰、数据对齐等特性不同;不同架构(Cortex-M3、M4、RISC-V)的寄存器和指令集不同。分目录可以清晰隔离这些差异。

3. 内存管理文件(portable\MemMang)

文件作用为什么放在 portable 下
heap_1.c只分配不释放,适用于简单应用内存分配策略依赖应用场景,用户可以根据需求选择或自定义
heap_2.c支持分配和释放,但不合并相邻空闲块同上
heap_3.c包装标准malloc/free,线程安全同上
heap_4.c支持分配、释放,并合并相邻空闲块(最常用)同上
heap_5.cheap_4,但支持多个非连续内存区域同上

为什么放在portable目录?
内存管理方案与硬件内存布局、编译器特性、应用需求相关,因此被设计为可替换组件。portable目录的本意就是“用户可以提供自己的实现”。

4. 头文件目录

4.1Source\include

包含所有内核公开的头文件:

头文件作用
FreeRTOS.h总包含文件,引入其他头文件
task.h任务管理 API 声明
queue.h队列、信号量、互斥量 API 声明
semphr.h信号量相关宏和函数声明
timers.h软件定时器 API 声明
event_groups.h事件组 API 声明
stream_buffer.h流缓冲区 API 声明
message_buffer.h消息缓冲区 API 声明
projdefs.h通用宏定义(如pdTRUEpdFALSE
portable.h移植层接口声明
list.h链表结构声明(内核内部使用)
stack_macros.h栈检查相关宏

4.2portable\[compiler]\[architecture]

包含portmacro.h,定义硬件相关数据类型和宏,是所有源文件需要包含的移植头文件。

4.3Core\Inc(或工程配置目录)

包含FreeRTOSConfig.h,这是用户配置文件,用于裁剪和配置内核功能(如是否启用软件定时器、tick 频率、堆大小等)。

为什么FreeRTOSConfig.h放在工程目录而不是 Source 目录?
因为它是工程特定的配置,每个工程可以有不同的配置,不应修改内核源文件。放在工程目录可以独立于内核源码进行管理。

5. 入口函数与启动流程

入口函数通常位于main.c中,与 STM32CubeMX 生成的代码结合:

osKernelInitialize();// 初始化 FreeRTOS 内核(创建空闲任务、初始化链表等)MX_FREERTOS_Init();// 创建用户任务(由 CubeMX 生成,位于 freertos.c)osKernelStart();// 启动调度器,开始任务调度
  • osKernelInitialize()osKernelStart()是 CMSIS-RTOS 封装,底层调用 FreeRTOS 的vTaskStartScheduler()等函数。
  • freertos.c中定义的任务创建代码最终会调用xTaskCreate()

总结:目录划分的设计思想

FreeRTOS/Source ├── include # 内核公共头文件(API 声明、内部数据结构) ├── *.c # 内核核心实现(与硬件无关) ├── portable │ ├── [compiler]/[arch] # 移植层(上下文切换、硬件相关数据类型) │ └── MemMang # 可替换的内存管理实现 └── (工程目录) ├── FreeRTOSConfig.h # 工程配置 └── main.c / freertos.c # 入口和任务创建
  • 核心代码与移植代码分离:方便支持不同硬件平台。
  • 配置与源码分离FreeRTOSConfig.h放在工程目录,避免修改内核源码。
  • 可替换组件独立:内存管理、协程等可选功能放在portable下,用户可按需选择。

如果你需要我根据具体的文件列表(比如你提到的image2image3中的内容)逐一解释,请将图片中的文字或文件名贴出来,我可以继续补充。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 6:01:38

基于WebView2的WinForm个性化浏览器开发:从内核定制到工程实践

简介:在现代桌面应用开发中,嵌入浏览器内核已成为基础需求,它实现了Web技术与本地系统的深度融合。其核心原理是通过Chromium内核提供现代Web标准支持,同时通过API实现深度行为控制。这一技术的核心价值在于平衡了Web生态的丰富性…

作者头像 李华
网站建设 2026/8/28 5:58:14

零基础上手 OpenClaw ,Windows端可视化向导完成本地 AI 智能体环境搭建

📖 前言 本文面向 Windows 系统使用者,系统梳理 OpenClaw 3.0.2 版本的标准化部署流程。整套安装过程完全依托可视化向导界面完成,全程无需输入任何命令行指令,即便是缺乏技术基础的用户,也能顺利完成整套环境部署。文…

作者头像 李华
网站建设 2026/8/28 5:58:12

开学了买什么东西?十大开学季好物,开学必买的物品清单速速Get

​随着新学期临近,校园生活即将重新开启。很多学生和老师都会利用开学前这段时间,提前补充和更新需要使用的物品。无论是第一次入学的新生,还是已经熟悉校园生活的老生,一份清晰的开学购物清单都能让准备过程更加轻松。但面对市场…

作者头像 李华
网站建设 2026/8/28 5:57:29

如何降低ai率不改坏数据?AI降重后做AIGC检测和论文查重

如何降低ai率不改坏数据?AI降重后做AIGC检测和论文查重 AI率降了,回看论文才发现样本量被改、正负号丢失、显著变成不显著,这种稿件不能提交。如何降低ai率不改坏数据,关键不是要求工具“保持原意”,而是先把论文中的…

作者头像 李华
网站建设 2026/8/28 5:55:24

C++/QT扫雷游戏大作业:从架构设计到高分实现的完整指南

简介:面向对象编程是软件工程的核心思想,通过将数据与操作封装成对象,实现代码的模块化与复用。其核心原理在于抽象、封装、继承和多态,能有效提升大型项目的可维护性和扩展性。在图形界面开发领域,QT框架的信号与槽机…

作者头像 李华
网站建设 2026/8/28 5:55:07

光模块产业链拆解:从800G到硅光与CPO的演进与工程实践

1. 背景:AI 算力爆发,光模块为何成为产业链焦点过去一年多,全球云计算厂商和 AI 大模型企业的资本开支明显提速,智算中心集群规模从千卡向万卡、十万卡迈进。随之而来的一个显著变化是:数据中心内部的数据互联需求呈指…

作者头像 李华