一. FreeRTOS简述
FreeRTOS 是一个开源的(Free)实时操作系统(RTOS - Real Time Operating System)内核,在 2003 年由 Richard Barry 发布,现已成为全球最流行的 RTOS 之一。FreeRTOS 被广泛应用于各种嵌入式设备中,包括物联网(IoT)设备、工业控制器、消费电子产品、汽车电子等。
1. 主要特点
- 开源且免费 轻量又高效:FreeRTOS 内核非常小巧,通常只占用几 KB 的内存,适合资源有限的嵌入式系统。
- 可移植性强:FreeRTOS 支持多种处理器架构,如:EFM32 Gecko(Cortex-M3 和 Cortex-M4F)、8051 兼容微控制器、STM32的F1、 F4、 F7 和 H7 等型号的 MCU 都可支持,在官方的技术手册中已存在超 30 种架构的芯片支持移植。
- 内部功能丰富:支持多任务并发执行,任务可以设置不同的优先级。提供队列、信号量、互斥量等机制,用于任务间的同步和通信。提供多种内存分配策略,如 heap_1、heap_2、heap_3、heap_4 和 heap_5。支持一次性定时器和周期性定时器,用于任务调度和时间管理。提供高效的中断处理机制,支持嵌套中断。
- 可扩展性:reeRTOS 支持多种插件和扩展,如FreeRTOS-Plus-TCP、FreeRTOS-Plus-CLI、FreeRTOS-Plus-IO 等等。
二. 获取FreeRTOS源码
下载FreeRTOS源码的官网地址链接: FreeRTOS源码下载
这里选择下载 FreeRTOS 202212.01 数据包。下载好后打开文件,
FreeRTOS 文件包含了FreeRTOS实时内核源码(这也是后续要移植的FreeRTOS源码)。
FreeRTOS-Plus 文件是实现了 FreeRTOS 内核的附加功能。与 FreeRTOS 核心库不同,FreeRTOS-Plus 库对 FreeRTOS RTOS 内核具有依赖性。
三. 使用STM32CubeMX生成工程
打开STM32CubeMX,选择STM32103C8芯片,设置基本配置。这里我将PA08与PA15引脚口设置为推挽输出模式,同时开启USART1串口外设功能。
注意:这里修改一下修改HAL库的时基源。将FreeRTOS占用的时基源与HAL库占用的时基源错开。
生成工程(以下简称keil工程文件)。
四. 移植FreeRTOS
1. 打开生成的keil工程文件,在该工程的主目录下新建名为FreeRTOS文件夹,然后在FreeRTOS文件夹中创建include、port、src文件夹。
2. 打开下载的FreeRTOSv202212.01源码文件夹,将FreeRTOSv202212.01\FreeRTOS\Source\include文件中的所有文件copy到keil工程文件的FreeRTOS\include文件中。
3. 打开下载的FreeRTOSv202212.01源码文件夹,将FreeRTOSv202212.01\FreeRTOS\Source\portable文件中的MemMang文件与RVDS文件copy到keil工程文件的FreeRTOS\port文件中。
4. 打开下载的FreeRTOSv202212.01源码文件夹,将FreeRTOSv202212.01\FreeRTOS\Source文件下中所有.c文件copy到keil工程文件的FreeRTOS\src文件中。
5. 打开下载的FreeRTOSv202212.01源码文件夹,将FreeRTOSv202212.01\FreeRTOS\Demo文件中查找到你创建工程所选芯片的demo例程,并将该例程文件下的FreeRTOSConfig.h,copy到keil工程文件的FreeRTOS\include文件中。
(这里我是使用的STM32F103系列芯片,因此我选择CORTEX_STM32F103_Keil例程移植)
提示:如果第5步不知道该如何选择Demo,可查看FreeRTOS官方文档说明链接:支持的演示 与链接:支持的设备 如下图对应Demo中文件名查看选择。
6. 打开创建的Keil工程,先编译一下,编译成功后在该工程设备树添加文件。
关于MemMang文件(内存分配实现示例)中的heap_1.c~heap_5.c文件选择谁(只能选一个),各自又有什么作用,在FreeRTOS官方文档说明也有说明链接:FreeRTOS 堆内存管理。
关于RVDS文件选择哪一个port.c文件,则去查看你所使用的芯片系列是ARM Cortex-M?内核。
7. 添加了.c文件对应的也需要添加.h文件。
8. 在stm32f1xx_it.c文件中添加代码。
extern void vPortSVCHandler( void );
extern void xPortPendSVHandler( void );
extern void xPortSysTickHandler( void );
到此FreeRTOS源码的移植就基本完成了,开始编译。