FreeRTOS移植

article/2025/8/27 4:32:41

1. 前言

本文是基于FreeRTOSv9.0.0版本的实时系统,移植到STM32F103芯片平台上。移植环境使用的是MDK5.32版本,我在移植之前就已经构建好了一个裸机工程源码了,而且已经确保了这份裸机代码是没有问题的。开始移植之前我强烈建议一定要确认自己的裸机测试代码是没有问题的,我一开始没有确认裸机代码,然后移植的时候出现了bug,以为是移植FreeRTOS的原因,然后一直找移植过程中是不是出了问题,最后才发现原来是自己裸机测试代码本身的问题。

2. 源码获取

获取源码可以直接到FreeRTOS的官网获取,官网:https://www.freertos.org/ 。或者到https://sourceforge.net/projects/freertos/files/FreeRTOS/这个网站下载都可以。我已经下载了v9.0.0版本了。

下载后得到的文件其实就是一个类似压缩包的可执行程序,双击解压就会在本目录下得到FreeRTOS解压后的源码,如下图所示:
在这里插入图片描述

3. FreeRTOS目录结构

我们解压出来后,就得到了FreeRTOS的源码了,里面包含了所需要的全部源码资料。这里对FreeRTOSv9.0.0版本的源码目录结构简单介绍一下。解压出来后,目录结构如下图:
在这里插入图片描述
其中FreeRTOS这个目录才是我们要关心的,里面包含核心部分的代码。而FreeRTOS-Plus目录的内容主要是一些组件和演示例程我们移植过程中不用去管。下面我列一个目录结构说明一下,这样比较清晰,如下:

├─FreeRTOS
│  ├─Demo               // 集成开发环境完整的Demo模板
│  ├─License            // 许可证相关
│  └─Source             // FreeRTOS的源码,非常重要,移植就是使用该目录里面的源码了
│      ├─include        // 源码的头文件
│      └─portable       // 不同硬件平台相关的代码
│            ├─MemMang  // FreeRTOS内存管理方案,我们选择其中一个文件即可
│            │     heap_1.c
│            │     heap_2.c
│            │     heap_3.c
│            │     heap_4.c
│            │     heap_5.c
│   		 ├─RVDS		// ARM架构相关的代码,我们在里面选择其中的CM3架构目录即可 
│            └─其他     // 其他架构、开发平台相关的代码
│      croutine.c       // 协线程(协程)文件,和任务类似,在系统资源比较缺乏下使用
│      event_groups.c   // 事件标志组
│      list.c           // 列表结构描述,在内核整体控制上都使用了列表格式数据处理,一切数据结构的基础
│      queue.c          // 队列,任务和任务之间的通讯处理
│      tasks.c          // 所有任务相关函数
│      timers.c         // 软件定时器,以任务形式存在
│      stream_buffer.c  // 流缓冲区文件,该文件是v10.0.0新增的,v9.0.0没有
└─FreeRTOS-Plus         // FreeRTOS生态相关的文件,基本用不到

其中最核心的文件有两个:

  • FreeRTOS/Source/tasks.c
  • FreeRTOS/Source/list.c

其他的核心文件可以根据功能可选。

4. 移植过程

既然已经准备好了源码,而且对源码目录也有了一个大概的了解,那我们就可以开始移植了。

4.1 添加源码

我们在裸机驱动的工程目录下添加一个freeRTOS目录,里面把把v9.0.0版本的Source目录下的源码拷贝到该目录下,如下图:
在这里插入图片描述
上面也介绍过portable目录下是不同的硬件平台相关的代码。里面我们只保留 keil、MemMang 和 RVDS这三个文件夹即可,其他我们使用不到。

4.2 Keil工程里面添加源码

我们打开自己验证OK的裸机驱动工程,然后在Keil中加入刚刚的那些FreeRTOS源码,如下图所示:
在这里插入图片描述
其中heap_4.c文件就是FreeRTOS的内存管理文件,在MemMang 目录下的。而port.c文件是在RVDS/ARM_CM3目录下的一个文件。

添加完这些文件之后,我们记得在Keil工程里面添加上相应的头文件路径,不然会报错说找不到各种头文件。

4.3 编译解决错误

我们把FreeRTOS的源码添加进Keil工程里面后,就可以先编译看看能不能通过了。编译后发现错误如下:

F:\STM32_Study_20210528\freeRTOS_Template\freeRTOS\include\FreeRTOS.h(98): error:  #5: cannot open source input file "FreeRTOSConfig.h": No such file or directory#include "FreeRTOSConfig.h"

报错其实就是说找不到FreeRTOSConfig.h这个头文件,那我们就要去添加这个头文件了。该头文件是位于源码目录下的FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil这个目录里面了,我们在CORTEX_STM32F103_Keil这个目录下把FreeRTOSConfig.h头文件拷贝到我们工程目录的freeRTOS\include目录下就行,然后继续编译。

解决完头文件找不到的错误后,再次编译发现已经完全没有错误了。

5. 移植验证

移植完之后,我们创建一个简单的任务进行验证。我们就写一个串口发送任务,每隔1秒钟像串口发送一次数据。代码如下:

#include <stdio.h>#include "bsp_usart.h"
#include "FreeRTOS.h"
#include "task.h"TaskHandle_t StartTask_Handler;			// 任务句柄/* 任务函数 */
void start_task(void *pvParameters)
{int i = 1;while (1){vTaskDelay(1000);printf("i = %d\n", i++);}
}int main()
{USART_Config();	printf("FreeRTOS test\n");/* 创建任务 */xTaskCreate((TaskFunction_t )start_task,            // 任务函数(const char*    )"start_task",          // 任务名称(uint16_t       )128,        			// 任务堆栈大小(void*          )NULL,                  // 传递给任务函数的参数(UBaseType_t    )1,       				// 任务优先级(TaskHandle_t*  )&StartTask_Handler);   // 任务句柄vTaskStartScheduler();          					// 开启任务调度
}

编译可以正常通过,下载到芯片运行,然后查看串口输出,我们观察到串口输出只打印了"FreeRTOS test"这个字符串,如下:
加粗样式
其实原因就在于我们并没有使用系统提供的几个和任务调度有关的中断函数接口。其实FreeRTOS已经帮我们提供了vPortSVCHandler、xPortPendSVHandler、xPortSysTickHandler这几个和任务调度有关的中断服务函数了,我们必须使用这几个中断服务函数去替换启动文件中的SVC_Handler、PendSV_Handler、SysTick_Handler的中断服务函数,这样FreeRTOS才能正常开始任务调度。修改如下图所示:
在这里插入图片描述
我们修改后再次编译下载,就可以看到串口每隔1秒钟打印输出一次数据了,如下所示:
在这里插入图片描述
看到上面的打印,说明我们的任务函数时正常运行了的,也就是说我们移植成功了。


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

相关文章

FreeRTOS快速入门-初探FreeRTOS

首发&#xff0c;公众号【一起学嵌入式】 对于 RTOS 入门系列文章&#xff0c;已经更新完一款&#xff08;RT-Thread&#xff09;&#xff1a; 助你快速入门 RT-Thread 这个系列的文章结合 RT-Thread&#xff0c;介绍过 RTOS 相关的核心知识。 接下来&#xff0c;开始另外一…

FreeRTOS系列|FreeRTOS简介

1. RTOS简介 RTOS全称为 Real Time Operation System&#xff0c;即实时操作系统。RTOS强调的是实时性&#xff0c;又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作&#xff0c;不允许超时&#xff1b;而软实时里对处理过程超时的要求则没有很严格。RTOS的核心就…

freertos任务基础知识(freertos篇)

多任务 对于单任务系统就是常说裸机大while循环&#xff0c;有的时候也需要加一些中断服务函数完成一些处理&#xff0c;相比于多任务而言上面的单任务系统也叫做前后台系统&#xff0c;即&#xff08;中断服务函数叫前台程序&#xff0c;大while叫后台程序&#xff09; 前后台…

FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架

目录 一、为什么要学习FreeRTOS 二、前言------从0到1认识FreeRTOS 1、逻辑系统与多任务系统 1.1、裸机系统&#xff1a;裸机系统通常分成轮询系统和前后台系统 1.2、多任务系统 2、数据结构-列表与列表项 三、任务 3.1基本属性 3.1.1任务栈 3.1.2任务控制块 3.1.3任…

一、初识FreeRTOS之FreeRTOS简介

目录 一、什么是FreeRTOS&#xff1f; 二、为什么选择FreeRTOS&#xff1f; 三、FreeRTOS的特点 四、FreeRTOS资料与源码下载 五、FreeRTOS源码文件介绍 一、什么是FreeRTOS&#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system,中文就是实时操作…

Docker技术入门与实战-第3版.pdf OCR 高清 可复制

Docker技术入门与实战-第3版.pdf OCR 高清 可复制 Docker技术入门与实战-第3版.pdf OCR 高清 可复制简介预览下载地址 Docker技术入门与实战-第3版.pdf OCR 高清 可复制 简介 本书从Docker基本原理开始&#xff0c;深入浅出地讲解Docker的构建与操作&#xff0c;内容系统全面…

从docker到kubernetes(k8s)入门与实战--docker教程

安装docker 装个依赖 yum -y install gcc gcc-c 卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 安装依…

Docker 入门到实战教程(二)安装Docker

一.卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…

Docker入门及进阶教程

阅读声明&#xff1a; 该教程笔记来源于dockers——菜鸟教程 一、Docker介绍 1. Docker教程 Docker是一个开源的容器引擎&#xff0c;基于Go语言并遵从Apache2.0协议开源。 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级&#xff0c;可移植的容器&#xff0c;然后发…

Docker 实战

目录 一、常用操作 1、镜像创建 2、镜像查询 3、镜像删除 4、镜像运行 5、查询容器进程 6、查询容器执行日志 7、删除容器 8、进入容器 二、导入和导出 1、save 和 load 2、export 和 import 3、区别 三、案例 1、检查是否安装依赖 2、安装依赖 3、docker打包镜…

Docker 实战教程之从入门到提高 (四)

本系列的前三篇文章&#xff0c;我们学习了如何在 Ubuntu 操作系统安装 Docker&#xff0c;并且通过实战练习&#xff0c;了解了 Docker 和宿主机操作系统文件目录互相隔离的实现原理&#xff0c;以及 Docker Volume 的工作原理。通过动手对 Nginx Docker 镜像进行修改&#xf…

Docker快速入门实战

为什么使用容器&#xff1f; 1、上线流程繁琐 2、资源利用率低 3、扩容/缩容不及时 4、服务器环境臃肿 5、环境不一致性 容器VS虚拟机 VM VS Container Docker 是什么 1、使用最广泛的开源容器引擎 2、一种操作系统级的虚拟化技术 3 、依赖于Linux内核特性&#xff1…

Docker教程(Docker实战)

Docker快速入门教程 **欢迎关注公众号【程猿薇茑】** 【仅需一次订阅,作者所有专栏都能看】 推荐【Kafka】https://bigbird.blog.csdn.net/article/details/108770504 推荐【rabbitmq】https://bigbird.blog.csdn.net/article/details/81436980 推荐【Flink】https://blog.csdn…

Docker最全教程——从理论到实战(一)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。 本篇教程持续编写了2个星期左右&#xff0c;只是为了大家更好地了解、理解和消化这个技术&#xff0c;能够搭上这波车。 你可以关注我们的公众号“magicco…

Docker 实战教程之从入门到提高(二)

本系列第一篇文章&#xff0c;Docker 实战教程之从入门到提高 (一)&#xff0c;我们已经介绍了如何在 Ubuntu 操作系统中安装 Docker&#xff0c;以及 Proxy 和 Insecure Registry 的配置。 本文继续 Docker 的实战学习。 练习1&#xff1a;通过一个简单例子学习 Docker 和宿…

docker简单实战

1.为ubuntu镜像添加ssh服务 1.1查看可用的ubuntu版本 1&#xff09;访问ubuntu镜像库地址&#xff1a;https://hub.docker.com/search?qubuntu&typeimag1e 2&#xff09;点击第一个ubuntu的官方镜像&#xff0c;选择tag标签&#xff0c;可以选择下载对应的ubuntu镜像 3…

Docker入门与进阶(基础+实战+进阶+Compose+Swarm)超详细版

Docker入门与进阶&#xff08;基础实战进阶&#xff09; 一、Docker入门1.1 Docker 概述1.2 Docker 安装、配置、卸载1.3 Docker 使用流程1.4 Docker 访问原理1.5 Docker 常用命令1.5.1 基础命令1.5.2 镜像命令1.5.3 容器命令1.5.4 其他常用命令1.5.5 镜像导出、导入 1.6 制作D…

Docker 入门到实战教程(三)镜像和容器

上一篇文章介绍到Docker的安装,那我们就来验证下 验证安装结果 docker run --rm hello-world输入以下的内容代表安装成功 file 下面开始镜像和容器操作 一. 镜像操作 Docker完美融合Linux&#xff0c;所以Docker命令行的风格和Linux还是比较接近的&#xff0c;相对来说比较容…

Docker入门实战大全终极版

Docker入门 学习推荐 哔哩哔哩 狂神说java 本文主要学习大纲 Docker组成 Docker基本操作 Docker安装卸载Docker阿里云镜像加速Docker run 运行流程图底层原理 Docker的常用命令 帮助命令镜像命令 docker images 查看所有本地的主机上的镜像docker search 搜索镜像docker pull…

Docker入门实战看这篇就够了(最新详细以及踩过的坑)

Docker入门实战看这篇就够了 前言初识是什么容器与虚拟机 能干什么去哪玩 安装先决条件查看自己的内核 安装所需的软件包(支持devicemapper存储类型)设置镜像的仓库设置yum源安装docker启动docker测试配置自己的阿里云镜像加速(强烈推荐)注册登录阿里云开发平台进入控制台选择容…