跳转到内容
新建笔记

FreeRTOS 源码目录与移植层选择

FreeRTOS 工程通常只编译内核的一部分文件、一个匹配目标的移植层,以及一个选定的动态内存实现。理解目录的作用,比把其他平台文件全部删除更稳妥;保留供应商原包也便于升级和核对版本。

完整发行包与独立内核

跳转到“完整发行包与独立内核”

历史上的完整 FreeRTOS 发行包常见以下组织:

发行包/
├── FreeRTOS/
│ ├── Demo/ 演示工程及公共测试任务
│ └── Source/ 内核代码
└── FreeRTOS-Plus/ 附加组件及其演示

单独下载 FreeRTOS-Kernel V11.1.0 时,仓库根目录本身就是内核目录,不能要求它同时包含所有板级 Demo 和 FreeRTOS-Plus。STM32Cube 固件包又可能把它放入 Middlewares/Third_Party/FreeRTOS/Source。识别实际包的根目录后,再写工程路径。

内核根目录/
├── tasks.c 任务、调度、任务通知
├── queue.c 队列及信号量、互斥量的底层实现
├── list.c 内核链表
├── timers.c 软件定时器
├── event_groups.c 事件组
├── stream_buffer.c 流缓冲区及消息缓冲区
├── croutine.c 历史协程功能
├── include/ 公共内核头文件
└── portable/
├── GCC/ARM_CM3/ 一个具体的处理器/编译器移植
├── IAR/...
├── RVDS/...
├── ThirdParty/...
└── MemMang/heap_1.c ... heap_5.c

核心任务/队列功能常从 tasks.c、queue.c、list.c 开始理解;软件定时器、事件组和缓冲区等功能还需要相应源文件及配置。名称是 tasks.c、timers.c、portable。在大小写敏感系统上,照抄旧资料中的 Portable 会使路径失效。

应用自己的 FreeRTOSConfig.h 放在应用配置目录,并把该目录加入头文件搜索路径。保留唯一生效的配置来源,避免编译器恰好先找到另一个同名文件。应用头文件一般先包含 FreeRTOS.h,再包含 task.h、queue.h 等具体接口。

  1. 确认内核版本、处理器内核、编译器和 ABI;对于有 FPU、MPU 或 TrustZone 的目标,还要核对相应变体。
  2. 只编译与目标匹配的 port.c、汇编等移植文件,并加入其 portmacro.h 所在目录。两个不同移植层不能一起编译。
  3. 如需动态分配,选择一种内存实现,例如 portable/MemMang/heap_4.c。不要把五种 heap_x.c 全加进去,它们会重复定义分配接口。
  4. 加入启用功能所需的内核源文件、公共 include 目录和应用配置目录。若使用 CMSIS 包装层,还需单独加入匹配版本的包装源文件与头文件。
  5. 对照链接映射检查移植函数、异常向量、堆实现及应用配置是否来自预期文件。

configTOTAL_HEAP_SIZE 对 heap_4.c 的静态堆数组有意义;heap_3.c 转接 C 库的分配器,heap_5.c 使用应用定义的内存区,不能把同一宏解释成所有方案的唯一堆容量。静态分配配置也不能替代对 Idle/Timer 任务内存回调等要求的检查。

完整发行包中的 Demo/Common/Minimal 保存许多可复用的演示任务;历史 Demo/Common/Full 含面向 PC 演示的旧代码。其余子目录通常是特定芯片、板卡和编译器的工程。

原笔记中的两个历史路径例子仍有助于理解命名:

目标移植目录示例板级演示工程示例
GCC、TriCore TC1782portable/GCC/TriCore_1782Demo/TriCore_TC1782_TriBoard_GCC
IAR、Renesas RX600portable/IAR/RX600Demo/RX600_RX62N-RDK_IAR

这些路径是否存在取决于下载版本。它们表达“工具链/架构移植”和“具体开发板工程”的差别,不表示每个内核移植都必然附带当前可编译的 Demo。可把匹配的官方演示作为启动文件、配置和构建选项的参考,但迁移时仍要核对芯片型号、时钟、内存布局、中断向量和引脚。

目录名有的表示编译器,有的表示架构、IDE、公共实现或第三方来源。不能仅根据这一层名称推断支持哪些 MCU。

标签含义或使用背景
ARMClangArm Compiler 的 Clang 系列工具链
ARMv8MArmv8-M 架构相关移植,不是编译器名称
BCCBorland C 工具链相关历史移植
CCSTI Code Composer Studio 环境,具体 CPU 由下级目录确定
CodeWarriorCodeWarrior 工具链相关移植,不能一概限定为 PowerPC
Common多个移植可能共用的文件
IARIAR Embedded Workbench 工具链
MemMang示例动态内存分配实现
MikroCMikroC 相关移植,核对具体产品和目标
MPLABMicrochip MPLAB 工具链环境,目标不限于 Arm
MSVC-MingWWindows 模拟移植对 MSVC/MinGW 工具链的组织,不是“MSVC 使用 MinGW 后端”
oWatcomOpen Watcom 相关历史移植
ParadigmParadigm/TERN 工具链相关历史移植
RenesasRenesas 工具链相关移植
RowleyRowley CrossWorks 相关移植
RVDSArm RealView 工具链相关历史移植
SDCCSmall Device C Compiler 相关移植
SoftuneSoftune 工具链相关移植
TaskingTASKING 工具链相关移植
ThirdParty按第三方来源组织的移植集合
WizCWiz-C 工具链相关历史移植

原目录笔记中的前后台与抢占调度示意图,放在任务管理中解释。目录结构只能帮助找到代码;能否满足实时需求,还取决于任务执行时间、阻塞时间、中断延迟和调度策略。