目录
1.1 为什么需要FreeRTOS
裸机开发直接控制硬件,虽然资源占用少,但开发复杂性高,缺乏高级功能,适合资源受限的简单应用。嵌入式操作系统提供了硬件抽象层、多任务处理、丰富的API和驱动支持,使得开发更加高效、可扩展和可维护,但需要更多的系统资源。
FreeRTOS是众多嵌入式操作系统中的一种,常用的还有uC/OS-II、RT-Thread、Linux等。uC/OS-II以其简洁高效的实时内核著称;FreeRTOS则提供了小型且高度可配置的实时多任务解决方案;RT-Thread在保持实时性的同时,融入了丰富的物联网特性与软件包支持;而Linux作为通用操作系统,以其强大的功能和广泛的硬件支持,也在嵌入式领域占据重要位置。以下是几种操作系统的对比。
特性/系统 | uC/OS-II | FreeRTOS | RT-Thread | Linux |
开发者 | Micrium公司 | Richard Barry | 中国开源社区 | 林纳斯·托瓦兹(Linus Torvalds) |
开源性 | 通常是商业许可,但存在开源版本 | 开源 | 开源 | 开源 |
设计理念 | 简洁、可裁剪的实时内核 | 小型、轻量级、高效 | 丰富的软件包和易于移植 | 通用性、多任务、网络支持 |
实时性 | 高 | 高 | 高 | 可通过特定配置实现实时性 |
可移植性 | 高 | 高 | 高 | 高,支持多种硬件平台 |
内存占用 | 低 | 极低 | 较低,但较FreeRTOS高 | 相对较高 |
多任务支持 | 支持 | 支持 | 支持 | 支持 |
任务调度 | 基于优先级 | 基于优先级,支持时间片轮转 | 基于优先级,支持多种调度策略 | 多种调度算法 |
设备驱动支持 | 有限,需自行开发或购买 | 有限,需自行开发 | 提供统一设备驱动框架,支持多种外设 | 丰富的设备驱动,涵盖广泛硬件 |
生态系统与社区 | 相对较小,但专业性强 | 活跃的开源社区 | 活跃的开源社区,但较Linux小 | 庞大的开源社区,丰富的资源 |
应用场景 | 工业控制、医疗设备 | 传感器控制、家电控制 | 智能家居、工业自动化、物联网 | 广泛,包括服务器、桌面、嵌入式等 |
FreeRTOS是一个轻量级的实时操作系统,广泛用于微控制器和小型微处理器。它以其高效的资源利用、可预测的实时性能和易于移植的特性,成为嵌入式系统开发者的首选之一。FreeRTOS提供了丰富的任务管理、时间管理、同步和通信机制,同时保持了代码的简洁性和可维护性。作为一个开源项目,FreeRTOS拥有活跃的社区支持,并且由Amazon提供长期维护和更新,是物联网和各种嵌入式应用中常用的操作系统。
1.2 FreeRTOS资料获取
FreeRTOS的源码和相应的官方书籍均可从官网www.freertos.org获得,官网首页打开后具体见图。
点击DownloadSource按钮,可以下载FreeRTOS最新版本的源码。如果想下载以往版本的可从托管网址:https://sourceforge.net/projects/freertos/files/FreeRTOS/下载。教程通过托管网址下载FreeRTOS最新版本。
有 zip 和 exe 格式两种不同的的压缩包可供选择,只是压缩的格式不一样,选择其中任意一个下载。
1.3 FreeRTOS文件夹内容
FreeRTOS源码中包含3个主要的文件夹,FreeRTOS文件夹包含了FreeRTOS内核的源代码和相关的头文件,这是FreeRTOS实时操作系统的核心部分,包括任务管理、时间管理、同步机制等功能的实现。FreeRTOS-Plus文件夹是FreeRTOS的扩展组件,提供了额外的功能,如TCP/IP网络堆栈、文件系统、安全协议等。tools文件夹包含了一些与FreeRTOS相关的工具,用于辅助开发、调试或测试FreeRTOS应用程序。这里我们主要学习的是第1个FreeRTOS文件夹。
FreeRTOS 包含 Demo 例程和内核源码,FreeRTOS 文件夹下的 Source 文件夹里面包含的是 FreeRTOS 内核的源代码,我们移植 FreeRTOS 的时候就需要这部分源代码; FreeRTOS 文件夹下的Demo 文件夹里面包含了 FreeRTOS 官方为各个单片机移植好的工程代码,下面我们对 FreeRTOS 的文件夹进行分析说明。
一级目录 | 二级目录 | 描述 |
Demo | Common | 包含多个示例项目共享的源代码和配置文件。 |
[Platform] | 包含特定平台的示例项目,如 CORTEX_M4F、CORTEX_M7 等。进行项目开发时,可以方便的以此搭建出自己的项目 | |
Source | include | 包含 FreeRTOS 内核的头文件。 |
portable | 包含与硬件架构相关的移植代码。 | |
portable/MemMang | 包含不同的内存管理实现,例如 heap_1, heap_2, heap_3, heap_4, heap_5。 | |
portable/Compiler | 包含特定编译器的移植文件,如 GCC、IAR、Keil 等。 | |
portable/Arch | 包含特定架构的移植文件,如 ARM、MIPS、Xilinx 等。 | |
Documentation | 包含 FreeRTOS 的官方文档,包括快速入门指南、API 参考等。 | |
License | 包含 FreeRTOS 的许可证文件。 |
这里我们重点分析一下FreeRTOS/ Source 文件夹下的文件,include文件夹包含FreeRTOS内核的所有公共头文件,这些头文件定义了FreeRTOS API、数据结构和宏。portable文件夹包含与特定硬件架构或编译器相关的代码,这些代码负责将FreeRTOS内核与目标硬件平台或编译器接口连接起来。其余部分则是一些通用的C文件。
Include文件夹具体描述如下表格。
文件/文件夹名称 | 描述 |
atomic.h | 原子操作相关的API,用于无序访问的数据操作。 |
croutine.h | 协程相关API,用于协程的创建和管理。 |
deprecated_definitions.h | 已弃用的宏定义,用于向后兼容。 |
event_groups.h | 事件组API,用于任务间的同步和通信。 |
FreeRTOS.h | FreeRTOS核心API,包含所有其他头文件。 |
list.h | 列表操作相关的数据结构和宏。 |
message_buffer.h | 消息缓冲区API,用于发送和接收消息。 |
mpu_prototypes.h | 内存保护单元(MPU)相关原型声明。 |
mpu_wrappers.h | MPU安全访问封装函数。 |
portable.h | 移植层相关的数据类型和宏定义。 |
projdefs.h | 项目定义的宏,如任务挂起和恢复。 |
queue.h | 队列API,用于任务间的数据传递。 |
semphr.h | 信号量API,用于任务同步。 |
stack_macros.h | 栈相关宏定义,用于任务栈操作。 |
StackMacros.h | 栈相关宏定义,用于任务栈操作。 |
stdint.readme | 关于标准整数类型定义的说明。 |
stream_buffer.h | 流缓冲区API,用于数据流的传输。 |
task.h | 任务创建和管理相关的API。 |
timers.h | 软件定时器API,用于任务定时操作。 |
portable文件夹在FreeRTOS中包含了使FreeRTOS能够与特定硬件架构和编译器接口兼容的代码,如任务上下文切换、内存管理和中断管理,同时提供了多种内存分配策略,确保了FreeRTOS内核的可移植性和高效运行。