一、环境
- STM32F103C8T6、Keil 5、ST-Link、FreeRTOS V9.0.0
二、准备工作
-
下载
-
下载FreeRTOS V9.0.0:代码托管网站:
FreeRTOS Real Time Kernel (RTOS) - Browse /FreeRTOS at SourceForge.netMarket leading real time kernel for 40+ microcontroller architectureshttps://sourceforge.net/projects/freertos/files/FreeRTOS/ -
下载FreeRTOS V9.0.0.zip
-
解压之后得到如下文件,这里我们只会用到FreeRTOS这个文件夹
-
-
文件夹介绍
- 打开FreeRTOS文件夹。Demo是一些官方的例程,License是一些许可证书(移植过程用不到),Source是FreeRTOS的内核源码文件
- 打开Source。include里面是一些头文件,portable里面是对应开发板的接口文件,下面的一些.c文件是内核文件
- 打开portable文件夹。对我们有用的只要下图所示三个文件夹,Memmang文件夹下是内存管理文件,推荐移植 heap_4.c ,RVDS文件夹下是对应的开发板接口文件,我们需要使用ARM_CM3文件夹下的 port.c 和 portmacro.h文件
-
模板准备
- 准备一个STM32工程模板用于移植FreeRTOS我使用的模板https://pan.baidu.com/s/1Lrdj8JxS7fZW7RJXcqQPwA?pwd=4132
- 修改工程模板名字为:1 STM32F103 FreeRTOS移植模板,后续将在这个模板中进行FreeRTOS的移植
- 工程模板下的已有文件
三、开始移植
-
新建文件夹用于存放移植FreeRTOS的文件
- FreeRTOS_core存放内核文件,FreeRTOS_port存放接口文件,头文件统一放在Include文件夹
-
拷贝文件
- 拷贝内核文件:将官方FreeRTOS V9.0.0的Source文件夹下的共6个.c文件拷贝到我们自己创建的FreeRTOS_core文件夹下
- 拷贝内存管理及接口文件:将Memmang下的 heap.c 和 RVDS 下的 ARM_CM3下的port.c拷贝到我们自己创建的FreeRTOS_port文件夹,拷贝完成如图
- 拷贝头文件:包括include中的所有 .h 文件和RVDS 下的 ARM_CM3下的 portmacro.h 文件,统一拷贝至工程模板中的Include文件夹。拷贝完成如图(显示部分)
- 拷贝 FreeRTOSConfig.h 文件,这个文件需要在例程源码中找,由于官方的文件没有中文注释,这里推荐B站普中视频教程中提到的文件。下面放上普中教程的FreeRTOS移植模板。普中-FreeRTOS移植模板https://pan.baidu.com/s/1ngTbd3BY1iCpQZRq6DCCag?pwd=4132
- 打开普中-FreeRTOS移植模板,找到 FreeRTOSConfig.h 文件,拷贝到我们自己的Include文件夹中
- 拷贝 system、SysTick、usart文件,.c文件拷贝至我们自己的System文件夹,.h文件拷贝至我们自己的Include文件夹
- 拷贝 led 和 main文件便于后续验证FreeRTOS移植是否成功。led.c拷贝至Hardware文件夹,led.h拷贝至Include文件夹,main.c拷贝至User文件夹
-
打开Keil ,添加相应的组、文件、路径等
- 添加组
- 向组中添加文件,如下图
- 添加文件路径
-
修改
- 打开 stm32f10x_it.c ,找到 SVC_Handler 和 PendSV_Handler 两个函数,将他们注释
- 在 stm32f10x_it.c 中找到 SysTick_Handler 函数,做如下修改并添加需要的头文件
- 这时编译一下,发现有21个Errors,如下图。这是因为普中教程使用的开发板容量较大,而我使用的是STM32F103C8T6,只要20k的RAM。所以需要打开FreeRTOSConfig.h文件(编译过后可在port.c文件下找到),修改“系统所有总的堆大小”,原配置是36*1024,我们改成15*1024
- 再编译,0 Error, 0 Warning
-
验证Free RTOS移植是否成功
- 根据自己的情况可修改led.h文件,我是将led接在PA0引脚,所以我做了如下修改
- 将程序烧录到开发板,观察led是否会闪烁,如果没有预期现象,可先检查一下烧录是否成功
-
至此,FreeRTOS移植完成!