一、FreeRTOS——系统移植
1 基本概念
1.1 操作系统的定义
一个通用操作系统提供的主要功能有(可见下图蓝色的部分):
-
任务(应用程序)的调度管理(重要)
-
堆栈和内存管理(重要)
-
文件管理
-
队列管理
-
中断和定时器管理
-
资源管理
-
输入输出管理
1.2 实时性的含义
实时操作系统(RTOS-Real Time Operating System)中实时(Real Time)指的是任务(Task)或者说实现一个功能的线程(Thread)必须在给定的时间(Deadline)内完成。
说明:Linux等操作系统一般把多任务都是称为多个线程,FreeRTOS中将线程称为任务。
1.3 FreeRTOS介绍
FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。
下图为FreeRTOS架构框图,一般情况也是只有基础内核。
学习FreeRTOS中,需要关注的概念:
-
任务管理:任务和结构体、任务状态管理、任务切换(任务中调用任务切换、中断中调用任务切换、systick中断中的任务切换)
-
通信机制:队列、队列集、流缓冲区、消息缓冲区、信号量和互斥锁、软件定时器、事件组和标志
2 手动系统移植
项目具体路径为:
2.1 拷贝FreeRTOS相关源码
在使用CubeMXSTM32F103RCT6创建项目后,在项目目录创建 FreeRTOS
文件夹,以及创建 src
和 port
子目录。
把 D:\BaiduSyncdisk\FreeRTOS_Study\FreeRTOS-9.0.0\FreeRTOS\Source
目录下面的 include
文件夹拷贝到 D:\BaiduSyncdisk\FreeRTOS_Study\01_STM32F103RCT6_FreeRTOS_CopyFreeRTOS9.0Create\STM32F103RCT6_FreeRTOS\MDK-ARM\FreeRTOS
目录下
把 D:\BaiduSyncdisk\FreeRTOS_Study\FreeRTOS-9.0.0\FreeRTOS\Source
目录下面的所有 *.c
文件,拷贝到 D:\BaiduSyncdisk\FreeRTOS_Study\01_STM32F103RCT6_FreeRTOS_CopyFreeRTOS9.0Create\STM32F103RCT6_FreeRTOS\MDK-ARM\FreeRTOS\src
目录下
把 Source/portable
下的 MemMang
和 RVDS
文件夹拷贝到 FreeRTOS/port
下
2.2 源码添加到工程
该项目的路径为:D:\BaiduSyncdisk\FreeRTOS_Study\02_STM32F103RCT6FreeRTOS
-
新建FreeRTOS/src和FreeRTOS/port组
-
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
-
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和FreeRTOS\port\RVDS\ARM_CM3中的port.c
- 添加头文件路径
- 拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程
- 打开stm32f1xx_it.c文件,在头部添加FreeRTOS的三个函数导入
- 在函数SVC_Handler中添加函数调用
- 在函数PendSV_Handler和SysTick_Handler中添加函数调用
- 修改main.c文件,添加头文件:
#include "FreeRTOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"
3 STM32cubeMX配置FreeRTOS工程
-
选择外部晶振作为高速时钟
-
进行系统配置。这里要勾选Debug 便于后续进行仿真调试。由于 FreeRTOS 是基于系统定时器的,所以创建 stm32 工程时要使用其他的定时器来进行计时。这里我使用的是定时器 TIM6。
-
配置系统时钟树。这里可以直接写入最大的频率,然后 回车(enter) 两次,系统则会自动配置时钟树。
-
配置 FreeRTOS,。这里使用 CMSIS_V2 最新的版本,主要是提供相同接口的函数,便于我们编写代码。
3.1 关于CMSIS接口
前面我们设置了 CMSIS。 其实这个 CMSIS 有两个版本:CMSIS_V1 和 CMSIS_V2 。
选择最新版本的 CMSIS_V2 具有更好的兼容性。
CMSIS的英文全称是:Common Microcontroller Software Interface Standard,直译过来就是“通用微控制器软件接口标准”;
它是一个用来让微控制器开发者减少学习时间、简化软件移植、加速工程创建仿真和加速应用产品上架的工具集合;
CMSIS的作用:
-
提供了接口标准,便于移植和管理
-
提供了很多第三方固件,便于业务开发
-
因为统一了接口,使底层硬件和上层应用耦合降低,更换硬件平台时只需开发人员改变底层硬件的驱动即可,上层业务应用程序无需做改动
4 关于系统移植的屏蔽3个函数
查看CubeMX创建的FreeRTOS工程,在 stm32f1xx_it.c
中,很明显删除了以下三个中断函数的定义。
void SVC_Handler(void) {
}
void PendSV_Handler(void) {
}
void SysTick_Handler(void) {
}
实际上是在 FreeRTOSConfig.h
中,宏定义定义了这个三个函数:
这其实跟手动移植拷贝FreeRTOS的道理是一样的,这里是通过宏直接指向,手动移植是通过函数调用。