1 基本概念

1.1 操作系统的定义

一个通用操作系统提供的主要功能有(可见下图蓝色的部分):

  • 任务(应用程序)的调度管理(重要)

  • 堆栈和内存管理(重要)

  • 文件管理

  • 队列管理

  • 中断和定时器管理

  • 资源管理

  • 输入输出管理

alt text

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架构框图,一般情况也是只有基础内核。

alt text

学习FreeRTOS中,需要关注的概念:

  1. 任务管理:任务和结构体、任务状态管理、任务切换(任务中调用任务切换、中断中调用任务切换、systick中断中的任务切换)

  2. 通信机制:队列、队列集、流缓冲区、消息缓冲区、信号量和互斥锁、软件定时器、事件组和标志

2 手动系统移植

项目具体路径为:

alt text

GitHub下载9.0版本的FreeRTOS

2.1 拷贝FreeRTOS相关源码

alt text

alt text

在使用CubeMXSTM32F103RCT6创建项目后,在项目目录创建 FreeRTOS 文件夹,以及创建 srcport 子目录。

alt text

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 目录下

alt text

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 目录下

alt text

Source/portable 下的 MemMangRVDS 文件夹拷贝到 FreeRTOS/port

alt text

alt text

2.2 源码添加到工程

该项目的路径为:D:\BaiduSyncdisk\FreeRTOS_Study\02_STM32F103RCT6FreeRTOS

  1. 新建FreeRTOS/src和FreeRTOS/port组

  2. FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加

  3. FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和FreeRTOS\port\RVDS\ARM_CM3中的port.c

alt text

  1. 添加头文件路径

alt text

  1. 拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程

alt text

  1. 打开stm32f1xx_it.c文件,在头部添加FreeRTOS的三个函数导入

alt text

  1. 在函数SVC_Handler中添加函数调用

alt text

  1. 在函数PendSV_Handler和SysTick_Handler中添加函数调用

alt text

  1. 修改main.c文件,添加头文件:
#include "FreeRTOSConfig.h"
#include "FreeRTOS.h"
#include "task.h"

alt text

3 STM32cubeMX配置FreeRTOS工程

  1. 选择外部晶振作为高速时钟

    alt text

  2. 进行系统配置。这里要勾选Debug 便于后续进行仿真调试。由于 FreeRTOS 是基于系统定时器的,所以创建 stm32 工程时要使用其他的定时器来进行计时。这里我使用的是定时器 TIM6。

    alt text

  3. 配置系统时钟树。这里可以直接写入最大的频率,然后 回车(enter) 两次,系统则会自动配置时钟树。

    alt text

  4. 配置 FreeRTOS,。这里使用 CMSIS_V2 最新的版本,主要是提供相同接口的函数,便于我们编写代码。

    alt text

关于编译错误问题,不能使用最新HAL库固件

alt text

3.1 关于CMSIS接口

前面我们设置了 CMSIS。 其实这个 CMSIS 有两个版本:CMSIS_V1 和 CMSIS_V2 。

选择最新版本的 CMSIS_V2 具有更好的兼容性。

alt text

CMSIS的英文全称是:Common Microcontroller Software Interface Standard,直译过来就是“通用微控制器软件接口标准”;

它是一个用来让微控制器开发者减少学习时间、简化软件移植、加速工程创建仿真和加速应用产品上架的工具集合;

CMSIS的作用:

  1. 提供了接口标准,便于移植和管理

  2. 提供了很多第三方固件,便于业务开发

  3. 因为统一了接口,使底层硬件和上层应用耦合降低,更换硬件平台时只需开发人员改变底层硬件的驱动即可,上层业务应用程序无需做改动

4 关于系统移植的屏蔽3个函数

查看CubeMX创建的FreeRTOS工程,在 stm32f1xx_it.c 中,很明显删除了以下三个中断函数的定义。

void SVC_Handler(void) {

}

void PendSV_Handler(void) {
  
}

void SysTick_Handler(void) {

}

实际上是在 FreeRTOSConfig.h 中,宏定义定义了这个三个函数:

alt text

这其实跟手动移植拷贝FreeRTOS的道理是一样的,这里是通过宏直接指向,手动移植是通过函数调用。

参考

参考1:FreeRTOS 从入门到精通 - 精华总结

参考2:基于STM32使用HAL库手把手移植FreeRTOS10.4.1

参考3:STM32cubeMX配置FreeRTOS工程

参考4:FreeRTOS工程编译缺失头文件freertos_mpool.h或freertos_os2.h