目前市面上的单片机操作系统很多,为何FreeRTOS会这么抢眼

目前市面上的单片机操作系统很多,为何FreeRTOS会这么抢眼

4b1cabe0d4666bf2f1d2d9dd5db1be29.png

随着嵌入式开发的认知度越来越高,从事这个专业或者以此为爱好的朋友也是越来越多,当在裸机开发的过程中遇到任务比较多,难以处理的时候,难免就会想到使用操作系统,目前市面上的单片机操作系统很多,其中有一个比较抢眼的就是FreeRTOS,这个系统是完全开源的一个操作系统,所以使用的话没有侵权的问题,而且可查阅的资料也很丰富,因此使用群体也是很大的一个数目,我们可以看一个2017年的数据,因为找了好久也没有找到最新的数据

2930c614542ebbc492c1b5bf86e4aa67.png

FreeRTOS是仅次于linux的操作系统,市场占比还是很不错的,估计最近两三年应该也不错,毕竟开源的东西,没有侵权问题,没有费用问题,对于国内的很多个人开发者来说还是相当友好的。

今天我们就一步一步的教大家如何移植一个简单的FreeRTOS例程!

FreeRTOS系统源码下载

第一步我们需要做的就是到官网去下载最新版本的FreeRTOS源码,这是我们移植的时候需要的,官网地址我给大家放这里了,可以直接点击进入哦

FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensionswww.freertos.org/

进入首页就可以看到下载的引导

ee567a17a78de9e4dca183c334134f04.png

不过,这是个国外的网站,访问起来可能会较慢,下载更是需要耗费不少的时间

目前官网提供的最新的版本是v10.4.1的,最好可以下载到最新的版本

FreeRTOS系统源码所包含的内容

下载压缩包之后打开,里面主要包含以下的这些内容

36e543374403d56f34d80b2b075c2b11.png

前面的两个文件夹是主要包含源码的文件夹,而第二个带有plus字样的这个文件夹,主要是基于第一个文件夹内容的一些扩展,可以看一下内容

a51b2bfd0a0f02f9b2a6263a15ab27fc.png

这个我们暂时使用不到,在初期我们主要的是使用第一个文件夹下的内容

在打开“FreeRTOS”文件夹之后分为这几个文件夹

26b47376f1f117d5d0727c9f12d43c93.png

demo文件夹,顾名思义,包含的是一些可以参考的例程,FreeRTOS提供的例程真心不错,包含各个工具链的,比如keil、eclipse等,包含各个不同的芯片的,基本上市面上主流的芯片在他们提供的demo里都可以找到。这个文件夹的主要作用就是给我们提供实例,教给我们如何使用,有很大的参考价值

source文件夹内存放的就是FreeRTOS的核心代码了,也是我们在待会说例程移植的时候重点用到的部分,打开这个文件夹,包含以下部分内容

3fbf194b7ec8658b6446f677a61ae286.png

include文件夹内包含所有的头文件,portable文件夹下包含的是和芯片接口相关的东西,我们打开这个文件夹之后可以看到,里面是进一步层级的芯片分类文件夹

29ae47ec0ce07cc710a450ed9d1c7a39.png

每个文件夹内包含的是一类芯片的接口文件

然后,最外层的这个七个源文件是FreeRTOS的核心代码,主要是操作内核的作用

以上就是FreeRTOS系统的主要文件构成,下面我们就来看一下如何移植一个简单的例程

如何移植一个例程

在操作这个之前,最好具备的前提:

第一、有一定的裸机开发经验,做过裸机开发的例程;

第二、会使用keil开发工具,这一讲我们是基于keil的,后续我们会讲述基于eclipse的

第三、手头有一个可以使用的开发板,以验证例程的正确性;

我们这里是基于一个裸机例程的,这样会省去裸机当中需要很多基础操作,这个不重要,如果你有裸机开发的经验的话,自己先新建一个就好了,毕竟这个不是太难,而用裸机原有例程的目的就是为了方面验证移植的正确性。

下面我们就正式开始:

第一步:将FreeRTOS的源码copy到我们的项目目录下,然后对系统做一下简单的剪裁,因为原有的系统体积有点大,我们尽量的缩小系统的体量,在”portable“文件夹下只需要留下三个重要的文件夹即可,当然这个不是随便留的,是和你使用的开发板有直接关系的,我使用的是STM32的板子,所以使用的是ARM内核,因此我留下的是以下三个,第二个内存管理是一样的,都需要,第一个也都需要,第三个就是根据内核型号做选择了;

0a8e7296b8ebfd3608fba6e4aa46351d.png

第二步:使用keil打开我们准备好的基础例程,打开之后先编译一下,确保原有的环境配置以及源码没有问题,然后再进行下一步操作;

第三步:打开“Manage Project Items"操作卡,新建两个分组,如下

56ce9a7ecee406111fa0df47d6e87c97.png

从这个命名上,大家应该可以猜到一个是用来存放核心代码的,一个是用来存放芯片的接口代码的,新建好之后,把相应的源文件添加到分组内

c8dca1b99c23014f7c2ec723edff2096.png

这个是核心代码需要添加的源文件,就是在上一小结中我们提到的,没有被分配到文件夹下的核心代码。

第二个文件分组就要注意了,这个需要根据你使用的开发板进行选择,首先要选择一个内存管理下的源文件,这里是在”MemMang“这个文件夹下,这里共有五个源文件

3d8ecc283f53b5ab1699bff064d01c7c.png

其对应的就是五种不同的内存管理方法,所达到的目的都是一样的,也各有优缺点,我们这里就先使用第四个,以后我们会详细的讲解不同的内存管理的优缺点。

然后,我们需要在选择一个port的源文件,我们使用的是STM32的芯片,内核是M3的,所以我们需要使用的是RVDS下的ARM-CM3文件夹下的port.c文件,添加之后的效果如下

fedefe28018b6bd44e43ccd28edf61e2.png

第四步:添加包含头文件,我们之前说到的系统源码还有一个专门的头文件文件夹,还有RVDS下也有头文件,需要把这些头文件路径做一下包含,如下

1920dd6b71398a15c16dc0510b8c96ca.png

第五步:移植一个FreeRTOSConfig.h的头文件,这个可以到demo工程中去找,每一个工程中都有这个文件,这是一个系统配置的文件,会使能一些系统的操作以及开启一些系统API函数等,这个部分涉及的内容比较多,需要单独去讲,所以这里建议先从demo中移植一个过来所使用,后续再慢慢理解;

第六步:编译调试,理论上来说,到这里你就可以编译你的移植工程了,有可能你编译会报错,如果报错的话就要根据报错内容去修改,一般到这一步出错都是可以通过更改FreeRTOSConfig内的配置解决的,当你解决完之后,编译通过,到此并不代表你成功的移植了,你还需要通过功能来验证;

第七步:在主函数实现功能,使用操作系统做功能,就需要建立task了,我们可以在主函数建立两个简单的task做一下验证,这里附上简单的例程代码,仅供参阅

首先定义变量函数

690d768ec752c6b126b8d1262103960d.png

主函数内创建任务

5747952da15651ad6563516fcd0bffaa.png

实现两个任务的任务函数

22853f7921d70304f94009f20e084cee.png

非常简单的例程功能,就是为了验证移植是否成功。

第八步:编写玩主函数之后,就可以再次编译了,编译成功之后,下载到你的开发板,测试例程是否按照设计的功能运行。

备注:功能的实现是基于你的基础例程的,这里没有提及,需要特别注意;主函数关于创建任务又是另一部分话题,这里没有展开去说,在后续的其他文章中会继续说明,展开的话,此篇内容篇幅太大,不利于阅读。

到此,一个简单的例程移植结束!

小结:主要从宏观上了解一下一个FreeRTOS的例程是什么样的,然后自己去实现一个简单的例程,系统涉及的内容面还是比较广泛的,很难一篇文章都提及,我们会在后续的文章中逐步的给大家展开。

猜你喜欢

转载自blog.csdn.net/danpianji777/article/details/124751373