GD32F4开发 -- FreeRTOS移植

之前讲过FreeRTOS,参看:FreeRTOS学习 – 再识
讲解了什么是FreeRTOS、FreeRTOS的特点、源码下载和目录文件介绍。
这里就不做更多讲解了,直接介绍怎么移植。

一、下载

官网:
https://www.freertos.org/zh-cn-cmn-s/

源码下载:
在这里插入图片描述

二、移植

在上篇文章GD32F4开发 – 工程模板创建 创建的工程里,新建一个FreeRTOS文件夹。
在这里插入图片描述

将源码FreeRTOSv202212.01\FreeRTOS\Source\include文件夹,移植到新建工程的FreeRTOS文件夹下。
在这里插入图片描述
将源码FreeRTOSv202212.01\FreeRTOS\Source\portable文件夹,移植到新建工程的FreeRTOS文件夹下。只保留Keil、MemMang、RVDS,将其他删除。
在这里插入图片描述
将源码FreeRTOSv202212.01\FreeRTOS\Source文件夹,移植到新建工程的FreeRTOS文件夹下。只保留C文件。
在这里插入图片描述
将FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil文件夹下的FreeRTOSConfig.h,移植到新建工程的FreeRTOS\include文件夹下
在这里插入图片描述
至此,文件移植完成。
在这里插入图片描述

三、文件描述

源文件里的Source目录文件描述:
在这里插入图片描述
其中:portable这个文件夹
在这里插入图片描述
Keil文件夹:里面的东西是必须的,但是我们打开keil文件夹以后里面只有一个文件:See-also-the-AVDS-directory.txt,意思是参考RVDS文件夹里面的东西!
MemMang: 这个文件夹就是跟内存管理相关的,我们移植的时候是必须的。
RVDS 文件夹针对不同的架构的MCU 做了详细的分类,GD32F407 就参考 ARM_CM4F,打开 ARM_CM4F 文件夹。
在这里插入图片描述
ARM_CM4F 有两个文件,这两个文件就是我们移植的时候所需要的!

四、创建FreeRTOS分组

创建FreeRTOS_core,添加FreeRTOS\Source目录下的C文件。
在这里插入图片描述
创建FreeRTOS_portable,添加FreeRTOS\portable\MemMang文件夹下的heap_4.cFreeRTOS\portable\RVDS\ARM_CM4F文件夹下的port.c
在这里插入图片描述.
这里为什么选择heap_4.c 和 ARM_CM4F文件夹下的port.c?

在使用RVDS(RealView Development Suite,即Arm的RealView开发工具)与FreeRTOS进行GD32F407项目的开发时,选择合适的移植文件对系统性能优化和浮点运算支持非常重要。### GD32F407的合适选择
使用ARM_CM4F移植文件夹:
GD32F407基于ARM Cortex-M4内核,并支持硬件浮点运算单元(FPU),因此选择`ARM_CM4F`目录中的移植文件是合适的。
RVDS编译器设置:
在RVDS中配置项目,确保启用FPU支持,这样编译器可以利用硬件浮点单元进行优化。
设置优化选项以从硬件特性中获得最佳性能。
移植文件中的端口设置:
确保FreeRTOSConfig.h中具有对应的设置,以充分利用GD32F407和FPU功能,例如:
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#define configUSE_FLOATING_POINT 1
#define configMINIMAL_STACK_SIZE ((unsigned short)256)### 总结
对于GD32F407上的FreeRTOS开发,推荐使用`ARM_CM4F`作为移植层,而在RVDS中进行编译时,确保启用了FPU支持,以便运行时利用硬件浮点特性进行优化。这样可以最大化利用GD32F407的计算能力和实时性能。
常用的heap_x.c选项
heap_1.c:
特点:最简单的内存管理,支持分配但不支持释放。
适用场景:适用于内存一直增长且没有释放需求的简单应用。
heap_2.c:
特点:支持内存分配和简单释放,但不支持合并空闲内存块。
适用场景:适用于内存分配和释放较少,且对碎片化不敏感的应用。
heap_3.c:
特点:使用C库的`malloc`和`free`,依赖于系统库的实现。
适用场景:适用于希望利用标准库内存管理的环境,多用于测试或特殊应用。
heap_4.c:
特点:支持合并空闲内存块,提供最好的碎片管理。
适用场景:适用于内存频繁分配和释放,并且对碎片化敏感的应用。
heap_5.c:
特点:添加对多个内存区域的支持,适合复杂的内存布局。
适用场景:适用于多个不连续内存区域的高级内存管理需求。
### 为GD32F407的推荐选择
heap_4.c:通常推荐使用`heap_4.c`,它在多个内存块的合并和碎片管理方面表现最佳。这对于GD32F407这样有足够RAM空间的M4系列处理器特别合适,尤其是在内存使用相对复杂的应用环境中。
选择合适的heap实现能有效提高系统内存管理的效率和稳定性。如果你的系统内存使用模式特别复杂,可以考虑`heap_5.c`来管理多个内存区域。

工程目录如下:
在这里插入图片描述

五、添加相关的头文件路径

在这里插入图片描述

六、FreeRTOSConfig.h配置

参看:FreeRTOS学习 – FreeRTOSConfig.h介绍

七、编译

编译一下,没有报错。说明移植完成了。

八、测试

创建一个task进行测试。
修改main.c

#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"#include "FreeRTOS.h"
#include "task.h"//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define FLOAT_TASK_PRIO		3
//任务堆栈大小	
#define FLOAT_STK_SIZE 		128  
//任务句柄
TaskHandle_t FLOATTask_Handler;
//任务函数
void float_task(void *pvParameters);//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建float任务xTaskCreate((TaskFunction_t )float_task,     	(const char*    )"float_task",   	(uint16_t       )FLOAT_STK_SIZE, (void*          )NULL,				(UBaseType_t    )FLOAT_TASK_PRIO,	(TaskHandle_t*  )&FLOATTask_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区}//float任务函数 
void float_task(void *pvParameters)
{static float float_num = 0.00;while(1){float_num+=0.01f;printf("float_num的值为:%.4f\r\n",float_num);vTaskDelay(1000);}
}/*!\brief      main function\param[in]  none\param[out] none\retval     none
*/
int main(void)
{//创建开始任务xTaskCreate((TaskFunction_t )start_task,            //任务函数(const char*    )"start_task",          //任务名称(uint16_t       )START_STK_SIZE,        //任务堆栈大小(void*          )NULL,                  //传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,       //任务优先级(TaskHandle_t*  )&StartTask_Handler);   //任务句柄   vTaskStartScheduler();          //开启任务调度//	systick_config();//	while(1) {
//	}
}

示例工程:
链接:GD32F407_OS_Temp_20240913.rar
提取码:djse

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

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

相关文章

【C++二分查找 容斥原理】1201. 丑数 III

本文涉及的基础知识点 C二分查找 容斥原理&#xff1a;组合数学汇总 LeetCode1201. 丑数 III 丑数是可以被 a 或 b 或 c 整除的 正整数 。 给你四个整数&#xff1a;n 、a 、b 、c &#xff0c;请你设计一个算法来找出第 n 个丑数。 示例 1&#xff1a; 输入&#xff1a;n …

总结拓展九:SAP数据迁移(2)

第三节 数据迁移工具LTMC实操 1、供应商&#xff08;BP&#xff09;主数据导入 1.1 首先在SAP S 4系统&#xff0c;通过事务代码“LTMC”跳转进入数据迁移控制台&#xff08;网页版&#xff09;&#xff1b; 1.2 点击“创建”按钮&#xff0c;创建迁移项目“NJDHMM-01”; 传…

大模型→世界模型下的「认知流形」本质·下

本篇内容节选自今年初我撰写的那篇10万的文章《融合RL与LLM思想&#xff0c;探寻世界模型以迈向AGI》&#xff0c;其观点也是文章中核心中的核心。 想进一步完整阅读的小伙伴可关注评论&#xff0c;节选内容如下↓ 接上篇..“因此当前无论对先验自回归学习下的LLMs也好还是未来…

基于python+django+vue的社区爱心养老管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的社…

用Python实现时间序列模型实战——Day 20: 时间序列预测的综合练习

一、学习内容 在本节中&#xff0c;我们将综合应用前几周学习的时间序列分析与预测方法&#xff0c;完成一个完整的时间序列预测项目&#xff0c;包含从数据预处理、异常检测、模型选择、预测到评估的全流程。项目流程&#xff1a; 1. 数据获取与预处理 数据加载&#xff0c…

三、二叉树-算法总结

文章目录 三、二叉树3.1 二叉树遍历3.1.1 前序遍历3.1.2 中序遍历3.1.3 后序遍历3.1.4 DFS 深度搜索3.1.5 BFS 广度搜索3.1.6 BFS 广度搜索 2 3.2 二叉树分治3.2.1 检验二叉搜索树3.2.2 二叉树的最大深度3.2.3 平衡二叉树 3.3 二叉树分治法3.3.1 二叉树中的最大路径和3.3.2 二叉…

mysql数据库如何开启binlog日志

首先我们要知道什么是binlog日志 binlog是 MySQL数据库的二进制日志文件&#xff0c;记录了数据库更改的所有操作&#xff0c;但不包括SELECT和SHOW这类操作&#xff0c;这些操作对数据进行修改、管理操作、数据库修改等操作都会被记录在日志中。 对于一个sql&#xff0c;它…

Qt-QPushButton按钮类控件(22)

目录 描述 使用 给按钮添加图片 给按钮添加快捷键 添加槽函数 添加快捷键 添加组合键 开启鼠标的连发功能 描述 经过上面的一些介绍&#xff0c;我们也尝试的使用过了这个控件&#xff0c;接下来我们就要详细介绍这些比较重要的控件了 使用 给按钮添加图片 我们创建…

在线IP代理检测:保护您的网络安全

在互联网飞速发展的今天&#xff0c;越来越多的人开始意识到网络安全和隐私保护的重要性。在线IP代理检测工具作为一种有效的网络安全手段&#xff0c;能够帮助用户识别和检测IP代理的使用情况&#xff0c;从而更好地保护个人隐私和数据安全。本文将详细介绍在线IP代理检测的相…

最好用的翻译器:什么是DeepL?如何订阅支付DeepL,订阅DeepL Pro以及申请DeepL API?

DeepL目前最好用的翻译软件&#xff0c;如果是学习翻译的同学或者海外客户翻译&#xff0c;一定不能错过&#xff0c;用它来处理文件&#xff0c;论文等翻译是最好不过了的&#xff01;&#xff01;&#xff01; AI翻译技术的飞速发展正在颠覆我们的沟通方式&#xff0c;打破语…

预测日前电价:回顾最先进的算法、最佳实践和公开基准——阅读笔记

Forecasting day-ahead electricity prices: A review of state-of-the-art algorithms, best practices and an open-access benchmark 预测日前电价&#xff1a;回顾最先进的算法、最佳实践和公开基准 Applied Energy (2021) 摘要&#xff1a;电价预测在过去二十年间已经得到…

【pycharm】安装以及简单使用教程

以windows版本举例&#xff1a; 1、首先去Pycharm官网&#xff0c;或者直接输入网址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff0c;下载PyCharm安装包&#xff0c;根据自己电脑的操作系统进行选择&#xff0c;对于windows系统选择下图的…

苹果CMS影视程序被举报侵权?有效解决方案指南

在当今数字时代&#xff0c;影视版权问题成为了许多网站面临的主要挑战。如果你使用苹果CMS进行影视内容管理&#xff0c;可能会遇到版权举报的问题。幸运的是&#xff0c;有一种有效的解决方案可以帮助你应对这些挑战——苹果CMS插件&#xff0c;它能够屏蔽原视频内容&#xf…

网络药理学:2、文章基本思路、各个数据库汇总与比对、其他相关资料(推荐复现的文章、推荐学习视频、论文基本框架、文献基本知识及知网检索入门)

一、文章基本思路&#xff08;待更&#xff09; 一篇不含分子对接和实验的纯网络药理学文章思路如下&#xff1a; 即如下&#xff1a; 二、 各个数据库&#xff08;待更&#xff09; 三、其他相关资料 1.推荐复现的文章 纯网络药理学分子对接&#xff1a;知网&#xff1…

《C++》解密--顺序表

一、线性表 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈...... 线性表在【逻辑上】是线性结构…

单调队列的实现

这是C算法基础-数据结构专栏的第二十五篇文章&#xff0c;专栏详情请见此处。 引入 单调队列就是满足单调性的队列&#xff0c;它最经典的应用就是给定一个序列和一个窗口&#xff0c;使窗口在序列中从前向后滑动&#xff0c;求出窗口在每个位置时&#xff0c;其中元素的最大/小…

STM32启用FPU浮点运算

这篇文章产生背景&#xff1a;其他人的文章太杂了&#xff0c;对我这种菜鸡无法接受&#xff1b; 参考文章&#xff1a; stm32h743单片机嵌入式学习笔记7-FPU_stmh743vit4-CSDN博客 stm32F407 打开 FPU(浮点运算处理器)_stm32f407开启fpu-CSDN博客 STM32F4CubeMXHal库下使能…

第J1周:ResNet-50算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前期工作1、ResNet-50总体结构2、设置GPU3、导入数据 二、数据预处理1、加载数据2、可视化数据3、再次检查数据4、配置数据集 三、构建ResNet-50…

初级练习[2]:Hive SQL查询汇总分析

目录 SQL查询汇总分析 成绩查询 查询编号为“02”的课程的总成绩 查询参加考试的学生个数 分组查询 查询各科成绩最高和最低的分 查询每门课程有多少学生参加了考试(有考试成绩) 查询男生、女生人数 分组结果的条件 查询平均成绩大于60分的学生的学号和平均成绩 查询至少…

基于python+django+vue的农业管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的农…