一、获取源码

1、官网下载

官网地址:https://www.freertos.org/

2、Github下载

Github地址:https://github.com/FreeRTOS/FreeRTOS/releases

二、源码介绍

1、源码整体结构

2、FreeRTOS文件夹结构

3、​​​​​​​Source文件夹结构

4、​​​​​​​portable文件夹结构

FreeRTOS操作系统归根到底是一个软件层面的东西,需要跟硬件联系在一起,portable文件夹里面的东西就是连接桥梁。由于我们使用MDK开发,因此这里只重点介绍其中的部分移植文件。

三、​​​​​​​FreeRTOS在基于HAL库项目中移植步骤

1、​​​​​​​目录添加源码文件

在例程(随便一个做过的项目)的根路径下,新建“FreeRTOS”文件夹,并且在里面新建“portable”和“source”两个空文件夹。

拷贝FreeRTOS源码的Source文件夹的7个.c文件到例程的source文件夹。

拷贝FreeRTOS源码portable文件夹下的Keil、RVDS、MemMang到例程的portable文件夹下。

其中例程的MemMang可只保留heap_4.c:

其中例程的RVDS可只保留ARM_CM3(对应我们的芯片内核)。

拷贝FreeRTOS源码include文件夹到例程的FreeRTOS文件夹下。

FreeRTOSConfig.h 文件是 FreeRTOS 的工程配置文件,因为 FreeRTOS 是可以裁剪的 实时操作内核,应用于不同的处理器平台,用户可以通过修改这个 FreeRTOS 内核的配置 头文件来裁剪 FreeRTOS 的功能,所以我们把它拷贝一份放在 user 这个文件夹下面。

在源码“..\FreeRTOS\Demo”文件夹下面找到 “ CORTEX_STM32F103_Keil ” 这个文件夹下,找到 “FreeRTOSConfig.h”文件,然后拷贝到我们工程下的 “Core/Inc” 文件夹下即可,等下我们需要对这个文件进行修改。

2、​​​​​​​工程添加源码文件

工程新建Group“FreeRTOS/Source”和“FreeRTOS/Portable”。

FreeRTOS/Source添加.c文件。

FreeRTOS/Portable添加port.c和heap_4.c文件。

添加配置头文件。

添加头文件。

FreeRTOS 的源码已经添加到开发环境的组文件夹下面,编译的时候需要为这些源文件指定头文件的路径,不然编译会报错。FreeRTOS 的源码里面只有 include 和RVDS\ARM_CM3这两个文件夹下面有头文件,只需要将这两个头文件的路径在开发环境里面指定即可。

同时我们还将 FreeRTOSConfig.h 这个头文件拷贝到了工程根目录下的 Core/Inc 文件夹下,这个路径本身就在开发环境里面。(放其他路径也可以, 就是一个.h文件)

3、​​​​​​​​​​​​​​系统配置文件修改

FreeRTOSConfig.h中添加如下3个配置:(我是用VScode打开的)

#define xPortPendSVHandler  PendSV_Handler

#define vPortSVCHandler     SVC_Handler

#define INCLUDE_xTaskGetSchedulerState   1

4、​​​​​​​修改stm32f1xx_it.c

​​​​​​​(1)引入头文件

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "FreeRTOS.h"

#include "task.h"

/* USER CODE END Includes */

​​​​​​​(2)注释掉2个函数

// void SVC_Handler(void)

// {

// }

// void PendSV_Handler(void)

// {

// }

​​​​​​​(3)添加SysTick时钟中断服务函数

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

extern void xPortSysTickHandler(void);

/* USER CODE END PV */

void SysTick_Handler(void)

{

    /* USER CODE BEGIN SysTick_IRQn 0 */

/* USER CODE END SysTick_IRQn 0 */

    /* USER CODE BEGIN SysTick_IRQn 1 */

    if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)

    {

        xPortSysTickHandler();

    }

    /* USER CODE END SysTick_IRQn 1 */

}

注意:HAL本身和FreeRTOS都默认依赖SysTick,可能出现卡死的问题。

为了保险起见,可以考虑在SYS选择HAL时钟源的时候换成其他的,并且中断优先级设为较高,比如1。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐