当前位置: 首页 > news >正文

【STM32】FreeRTOS的移植(一)(详细流程)

第一部分:FreeRTOS移植

这篇文章详细的讲述了如何将 FreeRTOS 移植到 STM32F1xx(以 STM32F103 为例) 的过程。你可以在你的工程创建中,按照步骤整理出完整的移植流程(并且我提供了测试任务,编写了创建说明),方便你学习和 创建FreeRTOS的实例 参考。

1、FreeRTOS 移植步骤

1.1 准备基础工程:

选择一个稳定可用的 STM32 工程作为基础。
这里我推荐使用“跑马灯实验”作为模板,因为其结构简单、易于调试。

1.2 获取 FreeRTOS 源码:

(1)、FreeRTOS官网下载。
(2)、固件库工程模板。

在这里插入图片描述
在这里插入图片描述

1.3 示例工程路径选择:

FreeRTOS 提供了丰富的示例,推荐从 Demo 文件夹中查找对应 MCU 的例程
STM32F103 示例路径如图 1.3.2.2 所示:
FreeRTOS\FreeRTOSvX.X.X\FreeRTOS\Demo\CORTEX_STM32F103_Keil

在这里插入图片描述


1.4 工程结构搭建

从零开始创建一个FreeRTOS例程

1 、准备基础工程
要移植 FreeRTOS,肯定需要一个基础工程,基础工程越简单越好,这里我们用的基础例程中的跑马灯实验来作为基础工程。

2、FreeRTOS 系统源码
FreeRTOS 系统源码已经详细的讲解过如何获取了,这里我们会将 FreeRTOS 的系统源码放到资料中去,路径为:资料->FreeRTOS 资料->FreeRTOS 源码

添加 FreeRTOS 源码

📁 1. 创建 FreeRTOS 文件夹(如下图):

在你的基础工程中添加 FreeRTOS 文件夹,用于放置 RTOS 所有源文件。
在这里插入图片描述

📁 2. 添加源码文件:

然后,创建 FreeRTOS 文件夹以后就可以将 FreeRTOS 的源码添加到这个文件夹中:

将以下内容复制到 FreeRTOS 文件夹:

include/
portable/
croutine.c
event_groups.c
list.c
queue.c
tasks.c
timers.c

在这里插入图片描述

📁 3. 精简 portable 目录:

只保留与 STM32 + Keil 相关的三个文件夹:

Keil/
MemMang/
RVDS/

进入 portable 文件夹,我们只需要留下 keilMemMangRVDS 这三个文件夹,其他的都可以删除掉:
在这里插入图片描述

🗂️ 4. 在 Keil 中新建分组:

打开基础工程,新建分组 FreeRTOS_CORE 和 FreeRTOS_PORTABLE,然后向这两个分组中添加文件:

FreeRTOS_CORE:添加核心 C 文件
FreeRTOS_PORTABLE:添加 port.cheap_4.c

在这里插入图片描述

1.5 添加头文件路径

添加完 FreeRTOS 源码中的 C 文件以后还要添加 FreeRTOS 源码的头文件路径:
在 Keil 中添加以下路径到 Include Paths

.\FreeRTOS\include
.\FreeRTOS\portable\RVDS\ARM_CM3

在这里插入图片描述

1.6 配置中断函数

FreeRTOS 会使用以下三个中断函数:

void SVC_Handler(void)
void PendSV_Handler(void)
void SysTick_Handler(void)

⚠️ 注意:不要在 startup 文件或 stm32f10x_it.c 中重复定义,否则会报错:
Error: L6200E: Symbol PendSV_Handler multiply defined


解决方法:注释掉默认的这三个 Handler 定义,只保留 FreeRTOS 中定义的。

在这里插入图片描述

配置好后,文件结构为:

在这里插入图片描述

使用FreeRTOS的 SysTick 调度器

在这里插入图片描述


第二部分:FreeRTOS 移植测试代码编写

1、FreeRTOS系统配置(宏配置(FreeRTOSConfig.h))

如果要使用静态方法的话需要将宏:打开 FreeRTOSConfig.h,启用静态任务创建功能:

#define configSUPPORT_STATIC_ALLOCATION    1
2、任务创建和删除实验(静态方法)
1、实验目的
学习 xTaskCreateStatic ()和 vTaskDelete()这两个函数的使用 ,即静态方法创建任务。2、设计实验
本实验设计三个任务: start_task、 task1_task 和 task2_task ,这三个任务的任务功能如下:
start_task:用来创建其他两个任务。
task1_task :当此任务运行 5 此以后就会调用函数 vTaskDelete()删除任务 task2_task,此任务也会控制 LED0 的闪烁,并且周期性的刷新 LCD 指定区域的背景颜色。
task2_task : 此任务普通的应用任务,此任务也会控制 LED1 的闪烁。

测试任务设计要求(实现 3 个任务 + 1 个浮点测试任务):

任务名优先级堆栈大小(x4)说明
start_task3128创建其他任务
led0_task4128控制 LED0 闪烁
led1_task5128控制 LED1 闪烁
float_task6128测试 FPU 与调度
3、创建任务结构(静态)
StaticTask_t xTaskBuffer;
StackType_t xStack[128];xTaskCreateStatic(TaskFunction, "TaskName", 128, NULL, 3, xStack, &xTaskBuffer);
4、删除任务函数使用
vTaskDelete(NULL); // 删除当前任务
vTaskDelete(xHandle); // 删除指定任务
问题排查:
问题							原因									解决方案
编译报重复定义 Handler		startup 文件中重复定义中断函数			注释掉 startup 中定义
堆栈溢出						任务堆栈太小							增加任务堆栈大小
LED 不闪						任务没执行							检查任务是否创建成功,调度器是否启动
测试:
1、FreeRTOS测试软件设计2.1、测试软件设计要求:(1)、创建一个start_task任务,Start任务用来创建其他任务。(2)、创建一个led0_task任务,用来控制LED0的亮灭。(3)、创建一个led1_task任务,用来控制LED1的亮灭。

在这里插入图片描述

因为内容篇幅有限,下一篇文章承接此文,继续完成 FreeRTOS 的代码部分(提供完整项目实例代码),编写完整的 FreeRTOS 测试软件设计 的核心部分 —— 任务创建与实现。 构建一个包含 3 个任务的基础多任务系统。

以上,欢迎有从事同行业的电子信息工程、互联网通信、嵌入式开发的朋友共同探讨与提问,我可以提供实战演示或模板库。希望内容能够对你产生帮助!

http://www.lryc.cn/news/597686.html

相关文章:

  • split() 函数在 Java、JavaScript 和 Python 区别
  • 电子设计大赛【摄像头循迹】讲解
  • 第1章第2章笔记
  • 力扣-贪心/动归dp-持续更新中。。。。。。
  • 白盒测试核心覆盖率标准详解文档
  • 【Windows命令手册】Windows中的常用命令,并与 Linux 做比较
  • micro avg、macro avg 和 weighted avg 的区别
  • Oracle19c HINT不生效?
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十一课——车牌识别的FPGA实现(3)车牌字符分割预处理
  • java设计模式 -【策略模式】
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十二课——车牌识别的FPGA实现(4)车牌字符的分割定位
  • Android组件化实现方案深度分析
  • 向华为学习——学习华为政务数据安全建设指南【附全文阅读】
  • 【机器学习深度学习】生成式模型的评估与验证
  • QPixmap::scaled参数说明
  • 跟著Qcadoo MES系统学习产品设计001
  • 突发限制下的破局之路:国产之光 Lynx 重构 AI 开发安全壁垒
  • [CH582M入门第十步]蓝牙从机
  • Nestjs框架: 基于Prisma的多租户功能集成和优化
  • 【大模型】Hugging Face常见模型格式详解
  • Linux Debian操作系统、Deepin深度操作系统手动分区方案参考
  • 解决Playwright启动报错:Executable doesn‘t exist at .../chrome-linux/chrome
  • 2025年华为HCIA人工智能认证发展前景如何?客观分析!
  • 459. 重复的子字符串
  • 系统思考:经济反馈的循环
  • [每日随题15] 前缀和 - 拓扑排序 - 树状数组
  • C# 日期与时间 DateTime 结构和TimeSpan 结构
  • 扫地机产品的电池CQC认证遵循哪个标准?
  • socket编程(TCP)
  • 位运算在算法竞赛中的应用(基于C++语言)_位运算优化