基于STM32的实时操作系统FreeRTOS移植教程(手动移植)

article/2025/4/26 14:50:47

        前言:此文为笔者FreeRTOS专栏下的第一篇基础性教学文章,其主要目的为:帮助读者朋友快速搭建出属于自己的公版FreeRTOS系统,实现后续在实时操作系统FreeRTOS上的开发与运用。操作系统的学习与运用可以说是每位嵌入式开发工程师必须掌握和熟悉的技能,对于MCU新手来说,将FreeRTOS作为第一个入手学习的操作系统可以说是非常合适的。本文将手把手对FreeRTOS实时操作系统的移植进行教学,分别包含:手动移植(本文为手动移植)CubeMX快速生成。(文末有代码开源!

一、FreeRTOS的简述

1.1 RTOS简介

        在提到FreeRTOS之前就不得不提到它的统称——RTOS实时操作系统Real Time Operating System,简称RTOS)是指当外界事件数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。

注意:细心的读者朋友可以看出,读者反复标红了快速规定时间快速响应实时等词语。这就是RTOS系统一个非常显著的特点,相较之下Linux操作系统可能在实时性上会差点。如果,以后读者朋友搞工程项目的时候一定要注意这点。

这里作者总结一下,实时操作系统RTOS提供的主要功能有:(1)应用程序的调度管理(2)堆栈和内存管理(3)文件管理(4)队列管理(5)中断和定时器管理(6)资源管理(7)输入输出管理

        RTOS只是一个统称,他可以分为各种各样的版本以及平台,由于RTOS需占用一定的系统资源(尤其是RAM资源,所以熟练掌握RTOS之后,工程师需要根据需求剪裁操作系统的大小和功能。),只有μC/OS-IIembOSsalvoFreeRTOS等少数能在小RAM单片机上运行。相对μC/OS-IIembOS等商业操作系统,FreeRTOS操作系统完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行。

        接下来,我们就来学习今天的主角——FreeRTOS

1.2 FreeRTOS简介

        FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。

其功能特点如下:
        (1)用户可配置内核功能( 可裁剪 )
        (2)多平台的支持
        (3)提供一个高层次的信任代码的完整性
        (4)目标代码小,简单易用
        (5)遵循MISRA-C 标准的编程规范
        (6)强大的执行跟踪功能
        (7)堆栈溢出检测
        (8)没有限制的任务数量
        (9)没有限制的任务优先级
        (10)多个任务可以分配相同的优先权队列,二进制信号量,计数信号灯和递归通信和同步的任务
        (11)优先级继承
        (12) 免费开源的源代码

        当然,由于开源免费使用的缘故。FreeRTOS整个社区生态很好,使用的人数众多,许多使用过程中出现的问题网上都可以轻松找到解决办法。

1.3 多任务操作系统

        说到多任务操作系统,我们就不得不提到我们的裸机开发,裸机开发的话,它并不是相对于多任务操作系统就很弱,他们俩在各自的领域有各自的使用场景,也有各自的优缺点(如果只有一两个任务用裸机比RTOS好很多)。

        比如说我们直接进行裸机开发,它主要是在我们的一个while循环中进行所有的项目操作,有些情况下,会有一个或者多个中断来处理一些突然发生的事或者已经设计好的事情,如果我们仅仅是开发一些小项目或者功能比较单一的项目,裸机是最可靠最有效而且很方便开发的一种模式,但是当我们的项目功能越来越多,我们就要引入多任务的操作系统,多任务操作系统顾名思义就是可以处理很多个任务,就像我们的手机一样,我们的手机后台也是可以挂起多个应用的。

        在我们引入操作系统之后,我们就不需要去精心的设计我们的时序流程,因为各个任务之间是不存在相互干扰的,我们只需要使用我们的命令去开启或者关闭某一些任务就可以了(这一点与Linux系统下实现任务一致,所以学习FreeRTOS对于后续Linux系统板的学习是很有意义的),当然这肯定是需要占用一些系统资源的,不过现在的单片机的内存都是足够大的,所以我们一般情况下是不需要担心我们的操作系统内核,而是直接移植进行使用,并且我们的多任务操作系统的思维,就很像我们人去思考的思维更加的方便,而我们的裸机开发更像是机械思维,在开发过程中以及开发流程中操作系统是非常方便使用以及开发的。

        说了这么多,为了帮助大家进一步理解实际的多任务操作系统,这里简单举一个例子。这里就以2个LED点亮操作为例,向大家展现出裸机RTOS之间的区别:

任务要求:这是只有一个LED的情况如果有2个LED,一个需要500ms闪烁,一个需要1s闪烁一次。

直接意识代码:

int main()
{while(1){//LED1置为高电平 ...... //延时1000MS ...... //LED1置为低电平 ...... //延时1000MS ...... //LED2置为高电平 ...... //延时500MS ...... //LED2置为低电平 ...... //延时500MS ......}
}

        这是我们大脑最希望的添加代码方式,很显然他是错的两个任务之间产生了相互的影响,使得两个任务都执行错误,这种思想在裸机开发中肯定是错的,但是在我们的RTOS中他就可以是对的

任务型代码:

//创建LED1任务
void LED1_Task()
{//LED1置为高电平 ...... //延时1000MS ...... //LED1置为低电平 ...... //延时1000MS ...... 
}//创建LED2任务
void LED2_Task()
{//LED2置为高电平 ...... //延时500MS ...... //LED2置为低电平 ...... //延时500MS ......
}

        这是独立的两个任务内容,我们只需要把他的扔到我们的任务执行器里,他就会“同时”运行了,很多小伙伴就会疑问了,单片机明明只有一个核,为什么可以同时执行多个任务呢?这就需要去了解RTOS操作系统中任务“同时”执行的原理

1.4 任务“同时”执行的原理

        在RTOS中,RTOS利用了一种类似于“视觉暂留”的工作原理,多个任务之间快速切换。在ROTS中,可以让我们的每个任务执行一个时间单位,然后就切换到另外一个任务执行一个时间单位,再切换回去,两个任务都是独立运行的,互不影响,由于切换的频率很快就感觉像是同时运行的一样

        上图为一个简单的示意图,读者朋友们可以结合该图好好理解一下RTOS系统的执行过程。

二、 FreeRTOS的手动移植

        为了图方便,笔者这里直接使用CubeMX去生成一个基于HAL库的初始STM32工程文件。不习惯用HAL库的,可以找一个标准库的初始STM32工程文件,进行手动移植工作。

①、建立STM32空工程

        这里使用STM32CubeMX快速创建项目,要注意的是我们完成最基本的配置以后,需要将我们的Timebase Source修改一下,修改成除了滴答定时器的其他定时器,如下图:

        这里我使用的TIM2作为Timebase Source

为什么不可以使用滴答定时器呢?

        在FreeRTOS中我们的SysTick定时器被用于了我们的始终基准,它用来实现我们的任务切换,我们的SysTick定时器每次触发我们的中断默认是一毫秒,可以自行修改为其他值

Timebase Source是干嘛的呢?

        简单的说,正常裸机开发中我们的SysTick定时器是用来主要是用来进行我们的HAL_Delay()延时的,使用其作为基准,前面我们说了SysTick定时器被用于系统任务切换了,所以它就是一直在工作,或者说一直在触发中断,这样的话我们的HAL_Delay()就需用使用我们的其他定时器(TIM2)进行替代其作用了

②、FreeRTOS内核下载 

        这一步将会教大家如何去下载FreeRTOS内核以及如何进行移植到我们的项目里面。

        首先,登入FreeRTOS的官网,地址:FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions

        点击右上角的Download FreeRTOS;  

        来到版本选择界面

        上面的是FreeRTOS的最新版本,下面的就是长期维护的版本

        我们直接点击上面这个Github超链接

        然后就依次带点击CodeDownload ZIP

        但是,这时候下载完成的压缩波其实并不包含FreeRTOS的子模块。所以,在该页面向下翻找。

        找到Kernel source(内核资源) 这里,点击箭头处的超链接;

        按照上方步骤下载压缩包,之后进行解压,最终成功得到2个文件夹;

        其中,FreeRTOS-Kernel-mainFreeRTOS的内核文件,FreeRTOS-main文件夹下的内容则比较繁杂,我们主要看里面Demo文件

        Demo文件夹里面的文件非常多,不过我们可以找到这样一个文件夹CORTEX_STM32F103_Keil

        CORTEX_STM32F103_Keil文件夹为官方将系统已经移植好的实例,但是这并不是我们直接移植的,感兴趣的小伙伴可以先打看官方移植好的能不能看懂。

③、手动移植FreeRTOS内核文件 

1、打开第一步建立的新项目 

2、左侧项目文件添加两个新的分组

3、建立对应的FreeRTOS文件夹

4、打开FreeRTOS-Kernel文件夹 

5、主目录下所有的.C后缀的文件全部复制我们的FreeRTOS文件夹下(一共七个)

6、复制include文件夹以及portable文件夹到FreeRTOS文件夹下

7、保留FreeRTOS/portable文件夹中的Keil、MemMang、RVDS文件夹,其余全部删除

8、保留FreeRTOS/portable/RVDS文件夹中的ARM_CM3文件夹

9、然后如图进行Keil项目的分组文件配置

10、添加对应的头文件

11、直接编译(出现9个错误)

 ④、项目问题修复

缺少FreeRTOSConfig.h文件(FreeRTOS的配置文件)

示例项目中复制粘贴并且添加到项目文件夹中(记得添加头文件路径) 

编译无错误  

⑤、项目添加处理

虽然没有错误了,但是我们的移植没有完成,还有一些小步骤需要完成,的确有些繁琐,好在逻辑性还是比较强的,理解起来相对容易。

在FreeRTOSConfig.h中添加#define xPortPendSVHandler PendSV_Handler 

在FreeRTOSConfig.h中添加#define xPortSysTickHandler SysTick_Handler

在FreeRTOSConfig.h中添加#define vPortSVCHandler SVC_Handler

左边三个是我们Free RTOS中定义好的函数,右边的是系统项目本来就定义好的函数,他们的作用小伙伴们可以去了解一下,作为初学者这里不进行拓展,反正就是和我们操作系统的中断还有任务切换有关的函数 

编译,还是报错,重复定义 

处理错误: 进入对应的文件stm32f1xx_it.c删除重复的3个函数

OK移植成功了!!! 

⑥、FreeRTOS点灯项目创建

相关的头文件引入:用到的头文件有“FreeRTOS.h”(操作系统相关)"task.h"(任务相关)

任务函数创建:

//任务1
void vTask1(void *pvParameters)
{for(;;){HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,0); HAL_Delay(1000);HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,1); HAL_Delay(1000);}
}
//任务2
void vTask2(void *pvParameters)
{for(;;){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,0); HAL_Delay(500);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,1); HAL_Delay(500);}
}

 主函数创建任务,以及开启任务调度器

⑦、程序烧录到开发板查看效果

        笔者使用的是正点原子的精英板,可以发现LED0和LED1分别按照既定任务同时运行中。各位读者朋友可以按照自己的实际情况去试试看FreeRTOS的效果。

总结

        本文为手动移植FreeRTOS的教程,目的仅为快速完成FreeRTOS的移植,并不过多深入去了解FreeRTOS。笔者认为只有先学会移植FreeRTOS,之后再去慢慢了解和使用FreeRTOS。通过这种学习方式,可能更方便大家去快速接受和体会操作系统的运行原理和流程。

代码

链接:https://pan.baidu.com/s/13a6uHqVXE5aVZg8PLEyx0g 提取码:8qdu


http://chatgpt.dhexx.cn/article/wb0RuM9q.shtml

相关文章

STM32F103--移植FreeRTOS完整教程

最近按照正点原子教程开始学习FreeRTOS,发现其手册的移植教程中有些地方可能不是那么详细,在此基于正点原子做一期最完整的FreeRTOS移植教程给大家。 小b将本次教程整理的资料放在网盘,以下链接供各位小伙伴下载和学习: 链接&…

FreeRTOS 正点原子教程学习笔记

正点原子视频教程 FreeRTOS(教程非常详细) 小知识 如果创建了任务却完全空着,没有while(1){延时}的话,整个程序会卡住,其他正常的任务无法运行。如果任务里单单有赋值之类的操作也会卡死在这个任务&#…

FreeRTOS入门教程(堆和栈)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、FreeRTOS操作系统介绍二、堆1.概念介绍2.简单实现 三、栈总结 前言 本篇文章正式学习FreeRTOS操作系统,我打算编写一系列文章带大家轻松快速入…

FreeRTOS移植到STM32

一、找一个STM32的裸机工程模板 我们以STM32F103裸机程序为例 随便找的一个裸机程序 二、去官网上下载FreeRTOS V9.0.0 源码 在移植之前,我们首先要获取到 FreeRTOS 的官方的源码包。这里我们提供两个下载 链 接 , 一 个 是 官 网 : http:…

韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验

文章目录 教程目录1.1 FreeRTOS目录结构1.1 FreeRTOS目录结构1.2 核心文件1.3 移植时涉及的文件1.4 头文件相关1.4.1 头文件目录1.4.2 头文件 1.5 内存管理1.6 Demo1.7 数据类型和编程规范1.7.1 数据类型1.7.2 变量名1.7.3 函数名1.7.4 宏的名 1.8 安装Keil1.8.1 下载Keil1.8.2…

freeRTOS中文实用教程1

资料转载出处 https://www.cnblogs.com/smartjourneys/p/7073450.html 1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性。本章主要讲述任务相关特性及调度相关的知识。 任务的总体特点 任务的状态 (1)任务有两个状态,运行态…

FreeRTOS入门

目录 一、简介 二、堆的概念 三、栈的概念 四、从官方源码中精简出第一个FreeRTOS程序 五、修改官方源码增加串口打印 一、简介 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、…

freeRTOS系列教程之【第一章】FreeRTOS概述与体验

文章目录 教程目录1.1 FreeRTOS目录结构1.1 FreeRTOS目录结构1.2 核心文件1.3 移植时涉及的文件1.4 头文件相关 1.4.1 头文件目录1.4.2 头文件 1.5 内存管理1.6 Demo1.7 数据类型和编程规范 1.7.1 数据类型1.7.2 变量名1.7.3 函数名1.7.4 宏的名 1.8 安装Keil 1.8.1 下载Keil1.…

【机器学习】3-4-2 流行学习

#3-4-2流行学习 import mglearn import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.datasets import load_breast_cancer from sklearn.datasets import make_moons from sklearn.datasets import make_blobs from sklearn.datasets impor…

【机器学习】(十八)用t-SNE进行流行学习:手写数字分类

PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方向)限制了有效性。 流行学习算法:是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化。t-…

用Python实现流行机器学习算法

对于此库的Octave/MatLab版本,请检查machine-learning-octave项目。 该库包含在Python中实现的流行机器学习算法的示例,其中包含数学背后的解释。 每个算法都有交互式Jupyter Notebook演示,允许您使用训练数据,算法配置&#xff0…

【流行学习】局部线性嵌入(Locally Linear Embedding)

一、前言 局部线性嵌入(LLE)假设数据在较小的局部是线性的,也就是说,某一个样本可以由它最近邻的几个样本线性表示,离样本远的样本对局部的线性关系没有影响,因此相比等距映射算法,降维的时间复…

流行-Manifold学习理解与应用

流行-Manifold【1】 流形,也就是 Manifold 。 1. 比较好的形象理解 流形学习的观点是认为,我们所能观察到的数据实际上是由一个低维流形映射到高维空间上的,即这些数据所在的空间是“嵌入在高维空间的低维流形。”。由于数据内部特征的限制&a…

【流行学习】拉普拉斯映射(Laplacian Eigenmaps)

一、前言 拉普拉斯特征映射是一种基于图的降维算法,它希望在原空间中相互间有相似关系的点,在降维后的空间中尽可能的靠近,从而在降维后仍能保持原有的数据结构信息。 二、主要步骤 拉普拉斯特征映射通过构建邻接矩阵为 W W W(…

7个流行的强化学习算法及代码实现

目前流行的强化学习算法包括 Q-learning、SARSA、DDPG、A2C、PPO、DQN 和 TRPO。 这些算法已被用于在游戏、机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进,本文我们将对其做一个简单的介绍。 1、Q-learning Q-learning&#xff1…

流行学习,比较好的一篇博客

转载自:https://blog.csdn.net/sinat_32043495/article/details/78997758 嵌入在高维空间的低维流形 流形:局部具有欧几里得空间性质的空间 1.较好的描述转载 作者:暮暮迷了路 链接:https://www.zhihu.com/question/2401548…

深度学习—近年来流行的卷积神经网络(一)

近年来流行的卷积神经网络 1. 回顾与目标2. 近年来流行的卷积神经网络2.1 VGGNet2.1.1 感受野的概念2.1.2 感受野的计算 2.2 GooleNet2.3 ResNet 3. 结尾参考资料 1. 回顾与目标 前面几讲,我们以LeNet和AlexNet为例,详细讲解了卷积神经网络的结构。从20…

流行学习常用算法

Isomap:等距映射。前提假设为低维空间中的欧式距离等于高维空间中的侧地线距离,当然该算法具体实施时是高维空间中较近点之间的测地线距离用欧式距离代替,较远点距离用测地线距离用最短路径逼近。 LLE:局部线性嵌入。前提假设是数据所在的低维…

流行学习与拉普拉斯变换的推导

参考:拉普拉斯矩阵 参考:流行学习

流行学习初步理解

一. 流形学习的英文名为manifold learning。其主要思想是把一个高维的数据非线性映射到低维,该低维数据能够反映高维数据的本质,当然有一个前提假设就是高维观察数据存在流形结构,其优点是非参数,非线性,求解过程简单。…