FreeRTOS移植详解:两种方法探索——CubeMX配置与自主移植
RTOS,即实时操作系统(Real time operating system)
它并非指代某一款特定的操作系统,而是一类操作系统的统称。
像 uc/OS、FreeRTOS、RTX、RT – Thread 等,都归属于 RTOS 类操作系统。
FreeRTOS 是一款小型的实时操作系统内核,具备轻量级的特性。
它涵盖了任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等诸多功能,
这些功能基本能够满足小型系统的需求。
由于 RTOS 运行时需要占用一定的系统资源,特别是对随机存取存储器(RAM)资源有要求
因此只有 μC/OS – II、embOS、salvo、FreeRTOS 等少数实时操作系统,能够在内存容量较小的单片机上稳定运行。
FreeRTOS 是一款应用于嵌入式系统的 RTOS,具备以下优势:
一、以下为STM32F103C8T6为例在STM32CubeMX上,引入FreeRTOS创建工程
裸机的时钟源默认是SysTick,但是开启FreeRTOS后,FreeRTOS会占用SysTick
用来生成1ms定时,用于任务调度,所以需要为其他的总线提供另外的时钟源,例如使用TIM1~TIM4
V2内核版本更高,功能更多,大多数情况下V1版本完全够用。
以下为FreeRTOS的核心配置介绍:
二、自行移植FreeRTOS
下载好后解压缩,点击进入FreeRTOS
点击进入Source
步骤:
1.在例程目录结构中新建文件夹,起名FreeRTOS,将需要移植的文件移入其中
2.将上图中所述Source中的include文件夹,portable文件夹(或者只复制其中所需文件夹)和所有的.c文件复制进去
3.如上图所示,根据实际情况在Demo中选择所需文件下,复制FreeRTOSConfig.h, 可放在工程的Core里的Inc下。(不管放在哪,只要在环境配置里面的include路径能找到它)
4.在kill中添加源码文件
5.系统配置文件修改
在 FreeRTOSConfig.h 中添加如下 3 个配置:
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define INCLUDE_xTaskGetSchedulerState 1
修改stm32f1xx_it.c
1.添加
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "FreeRTOS.h"
#include "task.h"
/* USER CODE END Includes */
2.注释掉两个函数
//void SVC_Handler(void)
//{
//}
//void PendSV_Handler(void)
//{
//}
3.在SysTick_Handler函数中添加 SysTick 时钟中断服务函数
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
xPortSysTickHandler();
}
在前面引用extern void xPortSysTickHandler(void);
以上为自行移植的方法,如果出现问题,可尝试在.io文件中将systick改为TIM,修改工程系统时钟依赖的时钟源
本文所述内容为本人通过网络自学后归纳所得,仅服务于个人复习与学习需求,无任何商业应用意图。
作者:早睡冠军候选人