STM32F407 移植 FreeRTOS

news2024/11/25 15:50:11

0. 实验准备

本实验是基于正点原子 STM32F407ZG 探索者开发板完成的,所以需要一个STM32F407ZG 探索者开发板
用于移植的基础工程(下面会讲)
FreeRTOS源码(下面会讲)

1. FreeRTOS移植

1.1 移植前准备

1.1.1 基础工程

由于后续需要用到 LED、 LCD、定时器、串口、内存管理等外设及功能,因此以正点原子标准例程-HAL库版本的内存管理的实验工程为基础工程进行 FreeRTOS 的移植 。
如下图所示
在这里插入图片描述
将此工程复制一份到我们需要移植 FreeRTOS 的文件中作为基础工程,同时修改名字,如下图所示
在这里插入图片描述
由于内存管理实验例程的 BSP 文件夹中可能不包含定时器的驱动文件,因此如果内存管理实验的 BSP 文件夹如果不包含 TIMER 文件夹,需要从定时器相关实验的 BSP 文件夹中拷贝一份 TIMER 到 FreeRTOS 移植基础工程当中,如从下列路径中找到 TIMER 文件夹拷贝到基础工程对应目录中,如下图所示。也可以在文章上方提供的代码包中直接找到基础工程。

标准例程-HAL库版本\实验9 通用定时器实验\实验9-1 通用定时中断器实验\Drivers\BSP

在这里插入图片描述

1.1.2 FreeRTOS 源码

FreeRTOS 源码可以通过官方获取,这里直接从正点原子的资料中获取,可以在下列路径中找到,如下图所示。如果是从官方下载的源码,注意版本为 V10.4.6,最好还是使用正点原子提供的源码,这样不会出现版本问题,也可以在文章上方提供的代码包中直接找到 FreeRTOS 源码。

资料盘(A盘)\6,软件资料\13,FreeRTOS学习资料

在这里插入图片描述
将此源码复制到要移植的文件夹中,然后解压,如下图所示
在这里插入图片描述

1.2 添加 FreeRTOS 文件

1.2.1 添加 FreeRTOS 源码

打开我们基础工程的 Middlewares 文件夹,然后新建一个 FreeRTOS 子文件夹,如下图所示
在这里插入图片描述
然后打开 FreeRTOS 源码的下列路径

\FreeRTOSv202112.00\FreeRTOS\Source

将红框中的文件全部复制到基础工程的Middlewares/FreeRTOS 下,如下图所示
在这里插入图片描述
复制完成后的Middlewares/FreeRTOS内容如下图所示
在这里插入图片描述

1.2.2 将文件添加到工程

使用 Keil5 打开我们的基础工程,新建两个文件分组,如下图所示
在这里插入图片描述
下图为添加完成后的目录结构
在这里插入图片描述
Middlewares/FreeRTOS_CORE 分组用于存放 FreeRTOS 的内核 C 源码文件, 将“上述步骤中的 FreeRTOS 目录下所有的 FreeRTOS 的内核 C 源文件添加到 Middlewares/FreeRTOS_CORE 分组中 ,如下图所示
在这里插入图片描述
Middlewares/FreeRTOS_PORT分组用于存放 FreeRTOS 内核的移植文件 ,需要添加两个文件到这个分组,分别为 heap_x.cport.c

  • 首先是 heap_x.c 。在路径 FreeRTOS/portable/MemMang下有五个 C 语言源文件,这五个 C 语言源文件对应了五种 FreeRTOS 提供的内存管理算法 ,读者在进行 FreeRTOS 移植的时候可以根据需求选择合适的方法,具体这五种内存管理的算法 ,在后续 会具体分析,这里就先使用 heap_4.c,将 heap_4.c 添加到 Middlewares/FreeRTOS_PORT 分组中。

  • port.c是 FreeRTOS 与 MCU 这个硬件连接的桥梁,因此对于不同系列的 STM32 开发板,所使用的 port.c 文件是不同的。 port.c文件的路径在 FreeRTOS/portable/RVDS 下。进入到 FreeRTOS/portable/RVDS,可以看到 FreeRTOS 针对不同的 MCU 提供了不同的 port.c 文件,具体正点原子的STM32系列开发板与不同 port.c 的对应关系如下表所示:

正点原子的STM32系列开发板类型port.c所在文件夹
STM32F1ARM_CM3
STM32F4ARM_CM4F
STM32F7ARM_CM7/r0p1
STM32H1ARM_CM7/r0p1

演示的开发板为 STM32F4 ,所以我是在 ARM_CM4F 中寻找的 port.c 文件,其他开发板以此类推,全部添加完成后如下图所示(红框为本小节添加的所有内容)
在这里插入图片描述

1.2.3 添加头文件路径

接下来添加 FreeRTOS 源码的头文件路径,需要添加两个头文件路径,一个头文件路径是 FreeRTOS/include,另外一个头文件路径为 port.c 文件的路径,根据不同类型开发板与 port.c 文件的对应关系进行添加即可(和上文中选择的文件保持一致)。 如下图所示
在这里插入图片描述

1.2.4 添加 FreeRTOSConfig.h 文件

FreeRTOSConfig.h 是 FreeRTOS 操作系统的配置文件, FreeRTOS 操作系统是可裁剪的,用户可以根据需求对 FreeRTOS 进行裁剪,裁剪掉不需要用到的 FreeRTOS 功能,以此来节约 MCU 的内存资源。获取 FreeRTOSConfig.h 有三个途径:

  1. 用户自行编写(不推荐,且对新手用户不友好)
  2. FreeRTOS 内核的演示工程,在 FreeRTOS 源码中,官方提供了 Demo 文件夹, 包含了 FreeRTOS 官方提供的演示工程,在工程当中就包含了每个演示工程对应的 FreeRTOSConfig.h 文件,读者可以在 Demo 文件夹中找到与自己所使用芯片相似的演示工程中的 FreeRTOSConfig.h 文件,并根据自己的需求,稍作修改 。(不推荐,兼容性不太好)
  3. 第三种途径,可以在正点原子资料的下列路径的 User 子文件夹下 找到 FreeRTOSConfig.h 文件

资料盘(A盘)\4,程序源码\3,扩展例程\2,FreeRTOS例程\FreeRTOS实验例程2 FreeRTOS移植实验

这个文件是参考 FreeRTOS 官网中对 FreeRTOSConfig.h 文件的描述,并针对正点原子的 STM32 系列开发板编写的。此文件在 FreeRTOSConfig.h 文件中并没有对 FreeRTOS 的功能作过多的裁剪,大部分的功能都保留了,在后续的部分实验中还需要对 FreeRTOSConfig.h 文件作相应的修改,以满足实验的需求。

本实验采用途径三,将上面路径的 User 子文件夹下的 FreeRTOSConfig.h 文件添加到基础工程的 User 子目录下即可 (正点原子的STM32系列开发板对应的 FreeRTOSConfig.h 文件是不通用的),如下图所示
在这里插入图片描述

1.3 修改 SYSTEM 文件

SYSTEM 文件夹中的文件一开始是针对 μC/OS 编写的,因此使用 FreeRTOS 的话,就需要作相应的修改。SYSTEM 文件夹中一共需要修改三个文件,分别是 sys.husart.cdelay.c

1.3.1 sys.h文件

sys.h 文件的修改很简单, 在 sys.h 文件中使用了宏 SYS_SUPPORT_OS 来定义是否支持 OS 因为要支持 FreeRTOS,因此应当将宏 SYS_SUPPORT_OS 定义为 1,具体修改步骤如下所示
在这里插入图片描述
找到下图所示的位置,修改为1
在这里插入图片描述

1.3.2 usart.c 文件

usart.c 文件的修改也很简单,一共有两个地方需要修改, 首先就是串口的中断服务函数,原本在使用 μC/OS 的时候,进入和退出中断需要添加 OSIntEnter()OSIntExit() 两个函数,这是 μC/OS 对于中断的相关处理机制,而 FreeRTOS 中并没有这种机制,因此将这两行代码删除,修改如下图所示中选中的代码(注意 F1 和 F4 系列的代码不一样,F1 系列下图不具有参考性)
在这里插入图片描述
删除完成后如下图
在这里插入图片描述
接下来 usart.c 要修改的第二个地方就是导入的头文件,因为在串口的中断服务函数当中已经删除了 μC/OS 的相关代码,并且也没有使用到 FreeRTOS 的相关代码,因此将 usart.c 中包含的关于 OS 的头文件删除,删除下图选中的代码
在这里插入图片描述
删除后如下图所示
在这里插入图片描述

1.3.3 delay.c 文件

接下来修改 SYSTEM 文件夹中的最后一个文件 delay.c 。大致可分为三个步骤:

  1. 删除适用于 μC/OS 但不适用于 FreeRTOS 的相关代码
  2. 添加 FreeRTOS 的相关代码
  3. 修改部分内容 。

2. 验证结果

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

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

相关文章

SpringCloud Gateway网关集成与配置

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…

桶装水站点APP小程序管理系统 方便快捷送水上门

夏天到了,又到了疯狂饮水的季节了,桶装饮用水是日常生活办公环境中必不可少的产品,这种必需品消耗快隔三差五就要购买一次。一般人都是通过电话预定的方式来购买桶装水,商家必须保证随时随地有人接听电话才能避免遗漏客户&#xf…

系列六、MongoDB文档相关操作

一、插入文档 1.1、单条插入 # 语法 db.集合名称.insert({json数据})# 案例 db.user.insert({"name":"张三","age":23,"birthday":"1997-07-07" }) 1.2、多条插入 # insertMany语法: db.collection.insertMan…

Docker 的数据管理和Dockerfile

-------------------------------------------Docker 的数据管理-------------------------------------------- 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。 …

ClickHouse集群安装与部署

这是一篇关于讲解如何安装部署ClickHouse集群的参考文章,希望通过此,大家都能了解ClickHouse,都能学会安装配置ClickHouse以及它的使用。 什么是ClickHouse? ClickHouse是Yandex于2016年开源的列式存储数据库(DBMS),主…

【String字符串之前篇】

目录 1.什么是字符串2.常用字符串的写法3.String字符串的底层原理3.字符串的比较3.1双等号和equals3.2 compareTo(String s) 方法3.3compareToIgnoreCase方法 4.String查找方法5.字符串的转换5.1字符串与数字转换5.2 大小写转换5.3 字符串与数组的转换 1.什么是字符串 对于&quo…

项目经理提升领导力的6个重点

1、以身作则 作为团队的领导者,要想更好地调动团队的积极性,最直接简单的方法就是以身作则,做团队的榜样。在要求团队成员之前,自己先做好,关键时候需身先士卒。 项目经理提升领导力的6个重点 2、共同目标 项目团队的共…

DataSecurity Plus:数字化时代的数据安全护卫者

引言: 在数字化时代,数据成为企业和个人生活中不可或缺的资产。然而,随之而来的是日益增长的数据安全威胁。为了保护数据的机密性、完整性和可用性,数据安全解决方案——DataSecurity Plus应运而生。本文将深入探讨DataSecurity …

嵌入式Android系统耳机驱动基本知识

开发项目的时候,接手的第一个驱动就是android平台下耳机的插拔检测和按键检测​。这部分涉及的硬件知识比较简单,但是软件上对中断的处理,软件检测的鲁棒性,都有比较高的要求,涉及到驱动开发中经常使用的中断申请&…

Linux下Python脚本的编写解析fio测试log(四)

在我们平常的测试盘的过程中,fio是一款业界最为通用的工具,通过Fio可以只知道一个盘具体的带宽,iops,延迟等等.比如下面这段fio的log 这里边需要拿出log里的一些参数 做成表格 如下: 下面说下如何用Python解析log并做成表格 1 同样是用到Python中文件…

【裸机驱动LED】使用汇编代码驱动LED(二)—— 汇编代码编写篇

上一部分我们已经整理出了所需寄存器的基地址、初始值,因为我们要给寄存器赋值,其实就是向指定地址写入内容。下面所有用到的基地址和初始化值都在上一篇总结好了。 【裸机驱动LED】使用汇编代码驱动LED(一)—— 寄存器解析篇_仲…

Nginx+Tomcat负载均衡,动静分离

文章目录 一.Nginx应用1.1Nginx负载均衡实现原理1.2Nginx动静分离实现原理 二.NginxTomcat负载均衡、动静分离(七层实例) 一.Nginx应用 Nginx是一款非常优秀的HTTP服务软件 支持高达50000个并发连接数的响应拥有强大的静态资源处理能力运行稳定内存、C…

spring.factories

Spring Boot 如何管理第三方Bean 首先抛出一个问题:如果想要被Spring容器管理的Bean的路径不再Spring Boot 的包扫描路径下,怎么办呢?也就是如何去加载第三方的Bean 呢?换句话说:在 Spring Boot 项目中,如果你想要被 …

使用 PicX 创建免费的图床神器

写博客文章时,图片的上传和存放是一个问题,我们也许会在不同的平台发布同一篇文章,这样一来每个平台都要上传图片。为了解决这些问题,做法是把图片统一上传到一个在线的第三方静态资源库中,我们把这个资源库称为图床。…

【博学谷学习记录】超强总结,用心分享丨人工智能 AI项目 ROUGE评估算法简记

目录 ROUGE核心思想评价标准ROUGE-NROUGE-L ROUGE ROUGE的全称是Recall-Oriented Understudy for Gisting Evaluation, 是一种基于召回率指标的评价算法. 核心思想 由多个专家分别生成人工摘要, 构成标准摘要集. 将模型生成的自动摘要和人工摘要做对比, 通过统计两者之间重叠…

C++ 结构体声明(定义)以及不同写法的差异

定义方式总结 在C中,结构体(struct)的定义主要有多种形式,,你还可以在定义结构体时直接初始化它的成员,或者在定义后创建结构体的实例。以下是一些例子: 定义并初始化结构体: str…

gitlab基本操作

1.gitlab 基本操作 git branch // 查看分支 git branch dev //新建dev 分支 git checkout dev //切换到dev 分支修改 **** git status // 查看哪些文件被修改 git add . //修改了文件需要提交添加上去(注意 . 点号) git commit -m “update”…

重温数据结构与算法之A star 算法

文章目录 前言一、原理1.1 网格距离1.2 宽度优先搜索1.3 Dijkstra 算法1.4 最佳优先搜索1.5 A*算法 二、代码实现2.1 伪码2.2 python 实现2.3 可视化 三、优缺点分析3.1 优点3.2 缺点 参考 前言 A*(A-Star)算法是一种静态路网中求解最短路径有效的直接搜索方法,也是…

uniapp(三) 之 表单提交

更换UI库 经过我昨天仔细看了下ThorUI,里面有个会员组件,好像有用的组件都是会员组件一样,作为一个白嫖怪,我决定今天再换一个UI库 引入后,根据组件位置自行调整位置 好了现在使用UNI-UI了 但是我的语法是vue3,官网范…

Hadoop数据仓库的主要特征有哪些?

数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持(Decision Support)。 数据仓库本身并不“生产”任何数据,其数据…