0. 实验准备
本实验是基于正点原子 STM32F407ZG 探索者开发板完成的,所以需要一个STM32F407ZG 探索者开发板
用于移植的基础工程(下面会讲)
FreeRTOS源码(下面会讲)
1. FreeRTOS移植
1.1 移植前准备
1.1.1 基础工程
由于后续需要用到 LED、 LCD、定时器、串口、内存管理等外设及功能,因此以正点原子标准例程-HAL库版本的内存管理的实验工程为基础工程进行 FreeRTOS 的移植 。
如下图所示
将此工程复制一份到我们需要移植 FreeRTOS 的文件中作为基础工程,同时修改名字,如下图所示
由于内存管理实验例程的 BSP 文件夹中可能不包含定时器的驱动文件,因此如果内存管理实验的 BSP 文件夹如果不包含 TIMER 文件夹,需要从定时器相关实验的 BSP 文件夹中拷贝一份 TIMER 到 FreeRTOS 移植基础工程当中,如从下列路径中找到 TIMER 文件夹拷贝到基础工程对应目录中,如下图所示。也可以在文章上方提供的代码包中直接找到基础工程。
标准例程-HAL库版本\实验9 通用定时器实验\实验9-1 通用定时中断器实验\Drivers\BSP
1.1.2 FreeRTOS 源码
FreeRTOS 源码可以通过官方获取,这里直接从正点原子的资料中获取,可以在下列路径中找到,如下图所示。如果是从官方下载的源码,注意版本为 V10.4.6,最好还是使用正点原子提供的源码,这样不会出现版本问题,也可以在文章上方提供的代码包中直接找到 FreeRTOS 源码。
资料盘(A盘)\6,软件资料\13,FreeRTOS学习资料
将此源码复制到要移植的文件夹中,然后解压,如下图所示
1.2 添加 FreeRTOS 文件
1.2.1 添加 FreeRTOS 源码
打开我们基础工程的 Middlewares 文件夹,然后新建一个 FreeRTOS 子文件夹,如下图所示
然后打开 FreeRTOS 源码的下列路径
\FreeRTOSv202112.00\FreeRTOS\Source
将红框中的文件全部复制到基础工程的Middlewares/FreeRTOS
下,如下图所示
复制完成后的Middlewares/FreeRTOS
内容如下图所示
1.2.2 将文件添加到工程
使用 Keil5 打开我们的基础工程,新建两个文件分组,如下图所示
下图为添加完成后的目录结构
Middlewares/FreeRTOS_CORE
分组用于存放 FreeRTOS 的内核 C 源码文件, 将“上述步骤中的 FreeRTOS 目录下所有的 FreeRTOS 的内核 C 源文件添加到 Middlewares/FreeRTOS_CORE
分组中 ,如下图所示
Middlewares/FreeRTOS_PORT
分组用于存放 FreeRTOS 内核的移植文件 ,需要添加两个文件到这个分组,分别为 heap_x.c
和 port.c
。
-
首先是
heap_x.c
。在路径FreeRTOS/portable/MemMang
下有五个 C 语言源文件,这五个 C 语言源文件对应了五种 FreeRTOS 提供的内存管理算法 ,读者在进行 FreeRTOS 移植的时候可以根据需求选择合适的方法,具体这五种内存管理的算法 ,在后续 会具体分析,这里就先使用heap_4.c
,将heap_4.c
添加到Middlewares/FreeRTOS_PORT
分组中。 -
port.c
是 FreeRTOS 与 MCU 这个硬件连接的桥梁,因此对于不同系列的 STM32 开发板,所使用的port.c
文件是不同的。port.c
文件的路径在FreeRTOS/portable/RVDS
下。进入到FreeRTOS/portable/RVDS
,可以看到 FreeRTOS 针对不同的 MCU 提供了不同的port.c
文件,具体正点原子的STM32系列开发板与不同port.c
的对应关系如下表所示:
正点原子的STM32系列开发板类型 | port.c所在文件夹 |
---|---|
STM32F1 | ARM_CM3 |
STM32F4 | ARM_CM4F |
STM32F7 | ARM_CM7/r0p1 |
STM32H1 | ARM_CM7/r0p1 |
演示的开发板为 STM32F4 ,所以我是在 ARM_CM4F 中寻找的 port.c
文件,其他开发板以此类推,全部添加完成后如下图所示(红框为本小节添加的所有内容)
1.2.3 添加头文件路径
接下来添加 FreeRTOS 源码的头文件路径,需要添加两个头文件路径,一个头文件路径是 FreeRTOS/include
,另外一个头文件路径为 port.c
文件的路径,根据不同类型开发板与 port.c
文件的对应关系进行添加即可(和上文中选择的文件保持一致)。 如下图所示
1.2.4 添加 FreeRTOSConfig.h 文件
FreeRTOSConfig.h
是 FreeRTOS 操作系统的配置文件, FreeRTOS 操作系统是可裁剪的,用户可以根据需求对 FreeRTOS 进行裁剪,裁剪掉不需要用到的 FreeRTOS 功能,以此来节约 MCU 的内存资源。获取 FreeRTOSConfig.h
有三个途径:
- 用户自行编写(不推荐,且对新手用户不友好)
- FreeRTOS 内核的演示工程,在 FreeRTOS 源码中,官方提供了
Demo
文件夹, 包含了 FreeRTOS 官方提供的演示工程,在工程当中就包含了每个演示工程对应的FreeRTOSConfig.h
文件,读者可以在Demo
文件夹中找到与自己所使用芯片相似的演示工程中的FreeRTOSConfig.h
文件,并根据自己的需求,稍作修改 。(不推荐,兼容性不太好) - 第三种途径,可以在正点原子资料的下列路径的
User
子文件夹下 找到FreeRTOSConfig.h
文件
资料盘(A盘)\4,程序源码\3,扩展例程\2,FreeRTOS例程\FreeRTOS实验例程2 FreeRTOS移植实验
这个文件是参考 FreeRTOS 官网中对 FreeRTOSConfig.h
文件的描述,并针对正点原子的 STM32 系列开发板编写的。此文件在 FreeRTOSConfig.h
文件中并没有对 FreeRTOS 的功能作过多的裁剪,大部分的功能都保留了,在后续的部分实验中还需要对 FreeRTOSConfig.h
文件作相应的修改,以满足实验的需求。
本实验采用途径三,将上面路径的 User
子文件夹下的 FreeRTOSConfig.h
文件添加到基础工程的 User
子目录下即可 (正点原子的STM32系列开发板对应的 FreeRTOSConfig.h
文件是不通用的),如下图所示
1.3 修改 SYSTEM 文件
SYSTEM
文件夹中的文件一开始是针对 μC/OS 编写的,因此使用 FreeRTOS 的话,就需要作相应的修改。SYSTEM
文件夹中一共需要修改三个文件,分别是 sys.h
、 usart.c
、 delay.c
。
1.3.1 sys.h文件
sys.h
文件的修改很简单, 在 sys.h
文件中使用了宏 SYS_SUPPORT_OS
来定义是否支持 OS 因为要支持 FreeRTOS,因此应当将宏 SYS_SUPPORT_OS
定义为 1,具体修改步骤如下所示
找到下图所示的位置,修改为1
1.3.2 usart.c 文件
usart.c
文件的修改也很简单,一共有两个地方需要修改, 首先就是串口的中断服务函数,原本在使用 μC/OS 的时候,进入和退出中断需要添加 OSIntEnter()
和 OSIntExit()
两个函数,这是 μC/OS
对于中断的相关处理机制,而 FreeRTOS
中并没有这种机制,因此将这两行代码删除,修改如下图所示中选中的代码(注意 F1 和 F4 系列的代码不一样,F1 系列下图不具有参考性)
删除完成后如下图
接下来 usart.c
要修改的第二个地方就是导入的头文件,因为在串口的中断服务函数当中已经删除了 μC/OS 的相关代码,并且也没有使用到 FreeRTOS 的相关代码,因此将 usart.c
中包含的关于 OS 的头文件删除,删除下图选中的代码
删除后如下图所示
1.3.3 delay.c 文件
接下来修改 SYSTEM
文件夹中的最后一个文件 delay.c
。大致可分为三个步骤:
- 删除适用于 μC/OS 但不适用于 FreeRTOS 的相关代码
- 添加 FreeRTOS 的相关代码
- 修改部分内容 。