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 等具体接口。
如何选取构建文件
跳转到“如何选取构建文件”- 确认内核版本、处理器内核、编译器和 ABI;对于有 FPU、MPU 或 TrustZone 的目标,还要核对相应变体。
- 只编译与目标匹配的
port.c、汇编等移植文件,并加入其portmacro.h所在目录。两个不同移植层不能一起编译。 - 如需动态分配,选择一种内存实现,例如
portable/MemMang/heap_4.c。不要把五种heap_x.c全加进去,它们会重复定义分配接口。 - 加入启用功能所需的内核源文件、公共
include目录和应用配置目录。若使用 CMSIS 包装层,还需单独加入匹配版本的包装源文件与头文件。 - 对照链接映射检查移植函数、异常向量、堆实现及应用配置是否来自预期文件。
configTOTAL_HEAP_SIZE 对 heap_4.c 的静态堆数组有意义;heap_3.c 转接 C 库的分配器,heap_5.c 使用应用定义的内存区,不能把同一宏解释成所有方案的唯一堆容量。静态分配配置也不能替代对 Idle/Timer 任务内存回调等要求的检查。
Demo 应当怎样复用
跳转到“Demo 应当怎样复用”完整发行包中的 Demo/Common/Minimal 保存许多可复用的演示任务;历史 Demo/Common/Full 含面向 PC 演示的旧代码。其余子目录通常是特定芯片、板卡和编译器的工程。
原笔记中的两个历史路径例子仍有助于理解命名:
| 目标 | 移植目录示例 | 板级演示工程示例 |
|---|---|---|
| GCC、TriCore TC1782 | portable/GCC/TriCore_1782 | Demo/TriCore_TC1782_TriBoard_GCC |
| IAR、Renesas RX600 | portable/IAR/RX600 | Demo/RX600_RX62N-RDK_IAR |
这些路径是否存在取决于下载版本。它们表达“工具链/架构移植”和“具体开发板工程”的差别,不表示每个内核移植都必然附带当前可编译的 Demo。可把匹配的官方演示作为启动文件、配置和构建选项的参考,但迁移时仍要核对芯片型号、时钟、内存布局、中断向量和引脚。
常见目录标签
跳转到“常见目录标签”目录名有的表示编译器,有的表示架构、IDE、公共实现或第三方来源。不能仅根据这一层名称推断支持哪些 MCU。
| 标签 | 含义或使用背景 |
|---|---|
ARMClang | Arm Compiler 的 Clang 系列工具链 |
ARMv8M | Armv8-M 架构相关移植,不是编译器名称 |
BCC | Borland C 工具链相关历史移植 |
CCS | TI Code Composer Studio 环境,具体 CPU 由下级目录确定 |
CodeWarrior | CodeWarrior 工具链相关移植,不能一概限定为 PowerPC |
Common | 多个移植可能共用的文件 |
IAR | IAR Embedded Workbench 工具链 |
MemMang | 示例动态内存分配实现 |
MikroC | MikroC 相关移植,核对具体产品和目标 |
MPLAB | Microchip MPLAB 工具链环境,目标不限于 Arm |
MSVC-MingW | Windows 模拟移植对 MSVC/MinGW 工具链的组织,不是“MSVC 使用 MinGW 后端” |
oWatcom | Open Watcom 相关历史移植 |
Paradigm | Paradigm/TERN 工具链相关历史移植 |
Renesas | Renesas 工具链相关移植 |
Rowley | Rowley CrossWorks 相关移植 |
RVDS | Arm RealView 工具链相关历史移植 |
SDCC | Small Device C Compiler 相关移植 |
Softune | Softune 工具链相关移植 |
Tasking | TASKING 工具链相关移植 |
ThirdParty | 按第三方来源组织的移植集合 |
WizC | Wiz-C 工具链相关历史移植 |
原目录笔记中的前后台与抢占调度示意图,放在任务管理中解释。目录结构只能帮助找到代码;能否满足实时需求,还取决于任务执行时间、阻塞时间、中断延迟和调度策略。