FreeRTOS 体验教程:1.FreeRTOS如何在stm32f103跑起来?

FreeRTOS 教程:1.从下载到多任务运行的完整指南

本文将详细介绍如何从零开始配置和使用 FreeRTOS。通过这篇教程,您将学习如何下载、配置、添加文件到 MDK 工程,并创建和运行 FreeRTOS 任务。每一步都有详细的说明和配图,帮助您更轻松地完成整个过程。

1. 新建文件夹

首先,在您的工作目录中新建一个文件夹,用于存放 FreeRTOS 的文件。这里我们命名为 rtos
image.png

2. 拷贝 FreeRTOS 源文件

从 FreeRTOS 的 GitHub 下载源码。将 source 文件夹拷贝到 rtos 路径下。
image.png

文件夹结构说明
  • include:头文件目录
  • portable:硬件接口相关文件夹(芯片接口相关/内存管理相关等)
    • Keil:ARM-MDK IDE 的启动文件(硬件接口)相关
    • MemMang:内存管理相关文件
    • RVDS:RVDS 编译环境的启动文件
    • GCC:GCC 编译环境的启动文件
    • 其他相关文件夹
  • *.c:FreeRTOS 的列表、队列、任务等实现源文件
3. 拷贝文件并添加到版本管理

将上述 source 文件夹拷贝到 rtos 文件夹内,并将其添加到 Git 版本管理中,以便后续追踪文件变动。
image.png

4. 精简工程

删除非必要的 IDE 相关启动文件,只保留需要用到的 Keil 相关文件,以精简工程。
image.png

5. 设置文件只读属性(可选)

将 FreeRTOS 内核相关的文件设置为只读属性,避免误修改。这一步是非必要的,但可以增加代码的安全性。
image.png

6. 添加文件到 MDK 工程

将 FreeRTOS 的文件添加到 MDK 工程中,并点击“OK”确认。
image.png
image.png

7. 配置 FreeRTOS

从示例代码中找到一个相近的工程,将其中的 FreeRTOSConfig.h 头文件拷贝到 MDK 工程目录下。后续的 FreeRTOS 功能配置都将在此文件中进行。
image.png

8. 添加头文件

FreeRTOSConfig.h 头文件添加到 MDK 工程中。
image.png

9. 添加头文件路径

在 MDK 工程中添加 FreeRTOS 的头文件路径,以确保所有相关文件都能被正确引用。
image.png

10. 修改中断服务函数

PendSV_HandlerSVC_Handler 两个中断服务函数修改为 FreeRTOS 提供的 xPortPendSVHandlervPortSVCHandler
有两种方法可以实现:

  1. 直接修改启动文件内的两个中断服务函数名为 xPortPendSVHandlervPortSVCHandler
    image.png

  2. xPortPendSVHandlervPortSVCHandler 重定义为 PendSV_HandlerSVC_Handler

如果选择第二种方式,并且使用 CubeMX 生成的工程,那么需要在 stm32f10x_it.c 文件内将 PendSV_HandlerSVC_Handler 两个中断函数注释掉,否则会报多重定义的错误。这里我们使用第二种方式:
image.png

主要是函数声明类型跟 INIT_xxx_EXPORT 要求的不一样,将函数返回值由 void 修改为 int 即可,当然函数内亦需要按实际情况 return 一个值。

11. 添加时钟中断服务函数

将 FreeRTOS 的时钟中断服务函数 xPortSysTickHandler 添加到 SysTick_Handler 函数中。可以参考 此链接 获取更多信息。

image.png

image.png

12. 添加头文件到主文件

FreeRTOS.htask.h 头文件添加到 main.h 文件中,以确保主文件能够正确引用 FreeRTOS 相关功能。
image.png

13. 创建任务

根据 API 文档 或在 task.h 文件中找到静态创建线程(任务)的接口,创建一个任务。

image.png

image.png

14. 编译提示错误

在编译过程中,如果出现错误:
image.png
可以查看 xTaskCreateStatic 函数的定义,发现函数被一个宏 configSUPPORT_STATIC_ALLOCATION 包裹:
image.png
且该宏默认关闭:

image.png

15. 启用宏定义

FreeRTOSConfig.h 头文件中启用 configSUPPORT_STATIC_ALLOCATION 宏定义,以支持静态内存分配。
image.png
#define configSUPPORT_STATIC_ALLOCATION 1

16. 添加缺失函数

如果编译过程中提示缺少 vApplicationGetIdleTaskMemory 函数的定义:
image.png
查看该函数,发现只有 extern 声明,并没有实现:
image.png
尝试添加该函数的空实现,编译则不再报错:
image.png
研究其作用,该函数用于为空闲任务分配任务堆栈及任务控制块的内存,添加相应的功能实现:
image.png
编译成功!

17. 添加调试信息

在任务内添加调试信息输出以验证任务的正确性:

image.png

编译烧写后,每秒输出一次调试信息:

image.png

18. 新建自定义线程文件 mythread.c

新建一个 mythread.c 文件,用于声明和实现动态/静态创建任务。
动态创建任务:
image.png

19. 创建动态线程

AppTasksCreate 任务内创建动态线程。
image.png

20. 编译验证动态创建的任务

编译烧写程序,验证动态线程的正常运行。

image.png

21. 创建静态线程

额外创建一个静态线程,与动态线程一起运行,实现多任务调度。
image.png
AppTasksCreate 任务内创建静态线程:
image.png

22. 最终验证

编译烧写程序,验证动态和静态线程的正常运行,确保多任务调度的实现。
image.png

以上步骤完成后,您将成功配置和运行 FreeRTOS,并且能够在项目中实现动态和静态创建任务、多任务调度。如果在过程中遇到问题,可以参考相关文档或社区资源进行进一步的了解和解决。希望这篇教程对您有所帮助,祝您在使用 FreeRTOS 时顺利、高效!

对应的 demo 源码, 请点击 RtosExPro at freertos_try_to_experience

也可扫码关注博主同名公众号"不解之榬",回复 “freertos” 获取
不解之榬

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值