FreeRTOS移植详解

一、前言

本文旨在讲解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的移植全过程,希望我的分享对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenSource - 基于Netty的网络扩展库HServer

文章目录 概述官网Hserver的理念特点原理图代码案例HelloWorld 概述 HServer是一个基于Netty开发网络扩展库.使用插件方式来扩展我们的业务 HServer提供 web,gateway,rpc 等插件 同时用户也可以自定义插件,来完成各种各样的业务场景。 官网 https://gitee.com/HSe…

1018:奇数偶数和1028:I love 闰年!和1029:三角形判定

1018:奇数偶数 要求:输入一个整数,判断该数是奇数还是偶数。如果该数是奇数就输出“odd”,偶数就输出“even”(输出不含双引号)。 输入样例:8 输出样例:even 程序流程图&#xff1a…

支付宝扫码(Easy版)支付实现

文章目录 一 技术准备1.1 二维码技术(java)1.2 支付宝沙箱环境准备1.3 内网穿透 二 支付宝支付相关知识2.1 各种支付方式2.2 扫码付接入流程2.3 系统交互流程(时序图)2.4 加密逻辑 三 扫码支付实现3.1 添加maven依赖(Easy版)3.2 完…

揭秘六大热门认证考试

六大热门认证考试是什么❓今天为大家详细解读PMP、ACP、CDGA、软考中项、软考高项、NPDP、CISP等热门认证考试,让你不再彷徨👇 1️⃣PMP 👑PMP认证是全qiu公ren的项目管理专业认证,旨在评估项目管理人员在项目过程中所需的知识、技…

05 Ciso模拟器连接腾讯云物联网开发平台

Ciso声明:本篇文章基于使用腾讯云物联网平台连接自定义esp8266物联网设备(腾讯连连控制开关实现) - CSDN App改编 一、总体概览 功能描述: 使用腾讯连连小程序进行控制, Alarm(警铃):开的时候&#xff…

【软考中级-软件设计师】day3:程序设计语言基础知识

概述 练习题 程序设计语言的基本成分 练习题 编译程序基本原理 名词解释 词法分析 词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作…

鸿蒙开发基础运用(ArkTS)-健康生活APP

健康生活应用,主要功能包括: 用户可以创建最多6个健康生活任务(早起,喝水,吃苹果,每日微笑,刷牙,早睡),并设置任务目标、是否开启提醒、提醒时间、每周任务频…

迟到的总结:回望 2023 年,期盼 2024 新机会、新挑战

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、RocketMQ,后续其他专栏会持续优化更新迭代 🌲文章所在专栏…

航空公司管理系统(迷你版12306)

要求 今天分享一个之前辅导留学生的作业,作业要求如下: Project E: Airways Management System Overall description: Your team is employed by an Airways company for the implementation of a computer system responsible for a large part of th…

Python从入门到网络爬虫(异常处理详解)

前言 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在python无法正常处理程序时就会发生一个异常。异常是python对象,表示一个错误。当python脚本发生异常时我们需要捕获处理它,…

Python 全栈体系【四阶】(十一)

第四章 机器学习 机器学习: 传统的机器学习:以算法为核心深度学习:以数据和计算为核心 感知机 perceptron(人工神经元) 可以做简单的分类任务掀起了第一波 AI 浪潮 感知机不能解决线性不可分问题,浪潮…

Git提交代码发生冲突的场景与解决方案

问题 当我们在使用 Git 向远程仓库提交代码时,可能会遇到如下所述的错误提示: To https://github.com/xxxxx/gitmerge.git! [rejected] master -> master (fetch first) error: failed to push some refs to https://github.com/xxxxx/gitme…

Vue2:脚手架Vue-CLI的使用

一、环境准备 vue脚手架(vue-CLI)的使用是基于nodejs环境下的。 你可以简单理解为,Java项目需要再jvm虚拟机上才能编译运行 nodejs的作用就是将vue文件编译成html、css、js代码文件。 如何安装nodejs 参考:https://blog.csdn.net…

ARMv8-AArch64 的异常处理模型详解之异常等级、执行状态以及安全状态

ARMv8-AArch64 的异常处理模型详解 一,特权和异常等级1.1 异常等级 Exception levels 二,特权的类型2.1 内存特权2.2 访问寄存器的特权 三,执行状态和安全状态3.1 执行状态 Execution states3.2 执行状态切换 3.3 安全状态 Security states3.…

第16课 播放rtsp流

在现实生活中有许多rtsp摄像头,这些摄像头如果能充分利用起来可以生成很多有趣、有用的应用:比如户外互动大屏等。在第4课,我们实现了一个播放器,当时来用它播放rtmp流和mp4时它好象工作的很好。这节课我们就用它来播放rtsp流试试…

二进制介绍

十进制转相应进制 (十进制)231 转 八进制 除八取余法 从下而上取余 231/828 ....7 28/83.......4 3/80........3 (十进制)231(八进制)0o347 (十进制)231 转 16进制 除十六取余法 从下而上取余 231/1614......7 14/160..........14 (十进制) 231(十六进制)0xe7 (十进制)231.3 转…

C++动态内存分配(动态内存分配函数)栈区

内存拷贝函数&#xff1a; void *memcpy(void *dest,const void *src,size_tn);#include<string.h>功能&#xff1a;从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest内存地址的起始位置 分配内存使用new 例如&#xff1a;salarynew int[num]; 最后需要释放…

Linux文件操作命令(touch、cat、more、cp、mv、rm)

之前我们学习了对目录&#xff08;即文件夹的操作&#xff0c;那么现在我们来一起看一下怎么操作文件吧&#xff09; 1.touch命令 功能&#xff1a;创建文件 语法&#xff1a;touch 参数 参数&#xff1a;被创建的文件路径 注意&#xff1a;touch命令无选项&#xff0c;参…

【Docker-Dev】Mac M2 搭建docker的redis环境

Redis的dev环境docker搭建 1、前言2、官方文档重点信息提取2.1、创建redis实例2.2、使用自己的redis.conf文件。 3、单机版redis搭建4、redis集群版4.1、一些验证4.2、一些问题 结语 1、前言 本文主要针对M2下&#xff0c;相应进行开发环境搭建&#xff0c;然后做一个文档记录…

面试算法88:爬楼梯的最少成本

题目 一个数组cost的所有数字都是正数&#xff0c;它的第i个数字表示在一个楼梯的第i级台阶往上爬的成本&#xff0c;在支付了成本cost[i]之后可以从第i级台阶往上爬1级或2级。假设台阶至少有2级&#xff0c;既可以从第0级台阶出发&#xff0c;也可以从第1级台阶出发&#xff…