一、前言
本文旨在讲解FreeRTOS在STM32单片机上的移植步骤,对于FreeRTOS在其他单片机上的移植已具有一定的参考意义。相信读者在看完这篇文章后,一定会有所收获!
文末附有相关资料连接,有需要的读者可以自行下载。
二、FreeRTOS源码初探
(一)、FreeRTOS源码的下载获取
FreeRTOS的真身在哪里呢?
可以到FreeRTOS官网下载,这是官网的下载链接:
FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions
打开以上链接后,按照图示步骤下载FreeRTOS源码
由于以上链接打开的时候较慢,我已经将下载好的源码上传至百度网盘,读者可以直接下载。
链接:https://pan.baidu.com/s/1_eubBSplXnkEzSvNfqbrRg?pwd=zxf1
提取码:zxf1
--来自百度网盘超级会员V3的分享
下载后相关文件夹里会出现以下内容:
至此我们就得到了FreeRTOS源码!
(二)、FreeRTOS文件初探
现在我们已经得到了FreeRTOS的源码,下面我们来看一下这个文件夹里的源码文件,初步了解一下这些文件的大致内容。
可以看出 FreeRTOS源码中有两个文件夹,4个HTML格式的网页和一个txt文档,HTML网页和 txt文档知道是什么东西了,重点在于上面那两个文件夹:FreeRTOS和FreeRTOS-Plus,这两个文件火里面的东西就是 FreeRTOS的源码。
注意观察就会知道, FreeRTOS和FreeRTOS-Plus,存在两个版本,怎么还会冒出一个“-Plus”版本?
我们知道苹果从Iphone6 以后分为了两个版本,区别就是 Plus比普通的功能多一点,配置强大一点。现在FreeRTOS也这么分,是不是Plus版本比FreeRTOS功能强一点啊,强大到哪里?是不是源码都不同了呀?
下面我们就一起来揭晓这个答案!
1、FreeRTOS文件夹
FreeRTOS文件夹中有三个文件夹,Demo、License和 Source,从名字上就可以很容易的得出他们都是些什么。
(1)、Demo文件夹
相信学习嵌入式的你,会敏锐地发现这个文件夹里包含了多种MCU适用的Demo。 其中就有ST的F1、F4和F7的相关例程,这对于我们学习来说是非常友好的,我们在移植的时候就会参考这些例程,这里我用的STM32F767的芯片,但是是可以用F407的工程的,因为他们都是Cortem-M4F的内核。
(2)、License文件夹
查阅相关资料,我了解到这个文件夹里面就是相关的许可信息,要用FreeRTOS做产品的得仔细看看,尤其是要出口的产品。
(3) 、Source文件夹
悄悄告诉你,这就是FreeRTOS本尊了!!!!
以上就是FreeRTOS 的源码文件,也是我们以后打交道的,可以看出,相比于UCOS来说FreeRTOS的文件非常少!
include文件夹是一些头文件,移植的时候是需要的,下面的这些.C文件就是FreeRTOS的源码文件了,移植的时候肯定也是需要的。
重点来看一下portable这个文件夹,我们知道FreeRTOS是个系统,归根结底就是个纯软件的东西,它是怎么和硬件联系在一起的呢?
软件到硬件中间必须有一个桥梁,portable 文件夹里面的东西就是FreeRTOS系统和具体的硬件之间的连接桥梁!不同的编译环境,不同的MCU,其桥梁应该是不同的,打开portable文件夹,如图所示:
从上图中可以看出FreeRTOS针对不同的编译环境和 MCU都有不同的“桥梁”,这里就以MDK编译环境下的STM32F767为例。
MemMang 这个文件夹是跟内存管理相关的,我们移植的时候是必须的!
Keil文件夹里面的东西肯定也是必须的,但是我们打开Keil文件夹以后里面只有一个文件: See-also-the-RVDS-directory.txto这个txt文件是什么鬼?别急嘛!
看文件名字"See-also-the-RVDS-directory",意思就是参考RVDS文件夹里面的东西!哎,好吧,在打开RVDS文件夹,如图所示:
RVDS文件夹针对不同的架构的MCU做了详细的分类,我这里的STM32F767就参考ARM_CM7,打开ARM_CM7中的r0p1文件夹,如图所示:
ARM_CM4F有两个文件,这两个文件就是我们移植的时候所需要的
2、FreeRTOS-Plus文件夹
与FreeRTOS一样,FreeRTOS-Plus也有Demo和Source,Demo都大同小异,这里就不做详解,里面一定是一些例程!
所以这里我们就着重看一下Source文件夹
可以看出,FreeRTOS-Puls中的源码并不是FreeRTOS系统的源码。是在这个FreeRTOS系统上另外增加的一些功能代码,比如CLI、FAT、Trace等等。就系统本身而言,和FreeRTOS里面的一模一样的,所以我们如果只是学习FreeRTOS这个系统的话,FreeRTOS-Plus就没必要看了。
三、FreeRTOS移植
(一)、准备工作
1、准备基础工程
要移植FreeRTOS,肯定需要一个基础工程,基础工程越简单越好,这里我准备使用STM32入门时学的跑马灯实验来作为基础工程。
2、FreeRTOS系统源码
根据上面提供的下载链接或官网获取到FreeRTOS源码
(二)、FreeRTOS移植
1、向工程中添加相应的组件
(1)、添加FreeRTOS源码
step1:在基础工程中新建一个名为FreeRTOS的文件夹,如图所示:
step2:创建FreeRTOS文件夹以后就可以将FreeRTOS的源码添加到这个文件夹中,添加后如图所示:
step3:前文已经讲过protable文件夹,所以这里我们只需要留下keil、MemMang和RVDS这三个文件夹,其他的都可以删除。完成后的结果是:
2、向工程分组中添加文件
打开基础工程,新建分组FreeRTOS_CORE和FreeRTOS_PORTABLE,然后向这两个组添加文件。
step1:打开工程,新建分组
step2:向这两个分组中添加文件
我想重点和大家分享一下FreeRTOS_PORTABLE分组中的port.c和heap_4.c是怎么来的?
port.c是RVDS文件夹下的夹下的 ARM_CM7中的文件,因为STM32F767是Cortex-M7内核并且带有FPU,因此要选择ARM_CM7中的port.c文件。heap_4.c是MemMang文件夹中的,前面说了MemMang是跟内存管理相关的,里面有5个c文件: heap_1.c、heap_2.c、heap_3.c、heap_4.c和 heap_5.c。
这5个c文件是五种不同的内存管理方法,就像从北京到上海你可以坐火车、坐飞机,如果心情好的话也可以走路,反正有很多种方法,只要能到上海就行。这里也一样的,这5个文件都可以用来作为FreeRTOS 的内存管理文件,只是它们的实现原理不同,各有利弊。
这里我们选择heap_4.c,至于原因,大家可以了解一下FreeRTOS的内存管理,自然就知道原因了。这里就先选择heap_4.c,毕竟本章的重点是FreeRTOS的移植。
3、添加相应的头文件路径
添加完FreeRTOS源码中的C文件以后还要添加FreeRTOS源码的头文件路径,头文件路径如图所示:
step1:step2:
step3:
step4:头文件路径添加完成以后编译一下,看看有没有什么错误,结果会发现提示打不开“FreeRTOSConfig.h”这个文件,如图所示:
啊……竟然出错了!!!!
如何解决以上错误呢?首先得分析一下错误的原因。
这是因为缺少FreeRTOSConfig.h文件,这个文件在哪里找呢?你可以自己创建,显然这不是一个明智的做法。我们可以找找FreeRTOS的官方移植工程中会不会有这个文件,打开FreeRTOS针对STM32F756的移植工程文件,文件夹是CORTEX_M7_STM32F7_STM32756G-EVAL_IAR_Keil,打开以后如图所示:
果然!官方的移植工程中有这个文件,二话不说复制到我们的工程中去,至于复制到什么地方大家可以自行决定,这里我为了方便放到了FreeRTOS源码中的include文件夹下。
FreeRTOSConfig.h是何方神圣?
看名字就知道,他是FreeRTOS的配置文件,一般的操作系统都有裁剪、配置功能,而这些裁剪及配置都是通过一个文件来完成的,基本都是通过宏定义来完成对系统的配置和裁剪的,关于FreeRTOS的配置文件FreeRTOSConfig.h大家可以查阅相关资料进行进一步了解。
至此,RTOS的移植已经大功告成!!!!
如果编译报错,可能是F4的芯片移植会出现以下错误,读者可看下一篇文章教你如何解决
四、结语
以上就是FreeRTOS的移植全过程,希望我的分享对你有所帮助!