FreeRTOS 教程:1.从下载到多任务运行的完整指南
本文将详细介绍如何从零开始配置和使用 FreeRTOS。通过这篇教程,您将学习如何下载、配置、添加文件到 MDK 工程,并创建和运行 FreeRTOS 任务。每一步都有详细的说明和配图,帮助您更轻松地完成整个过程。
1. 新建文件夹
首先,在您的工作目录中新建一个文件夹,用于存放 FreeRTOS 的文件。这里我们命名为 rtos
。
2. 拷贝 FreeRTOS 源文件
从 FreeRTOS 的 GitHub 下载源码。将 source
文件夹拷贝到 rtos
路径下。
文件夹结构说明
include
:头文件目录portable
:硬件接口相关文件夹(芯片接口相关/内存管理相关等)Keil
:ARM-MDK IDE 的启动文件(硬件接口)相关MemMang
:内存管理相关文件RVDS
:RVDS 编译环境的启动文件GCC
:GCC 编译环境的启动文件- 其他相关文件夹
*.c
:FreeRTOS 的列表、队列、任务等实现源文件
3. 拷贝文件并添加到版本管理
将上述 source
文件夹拷贝到 rtos
文件夹内,并将其添加到 Git 版本管理中,以便后续追踪文件变动。
4. 精简工程
删除非必要的 IDE 相关启动文件,只保留需要用到的 Keil 相关文件,以精简工程。
5. 设置文件只读属性(可选)
将 FreeRTOS 内核相关的文件设置为只读属性,避免误修改。这一步是非必要的,但可以增加代码的安全性。
6. 添加文件到 MDK 工程
将 FreeRTOS 的文件添加到 MDK 工程中,并点击“OK”确认。
7. 配置 FreeRTOS
从示例代码中找到一个相近的工程,将其中的 FreeRTOSConfig.h
头文件拷贝到 MDK 工程目录下。后续的 FreeRTOS 功能配置都将在此文件中进行。
8. 添加头文件
将 FreeRTOSConfig.h
头文件添加到 MDK 工程中。
9. 添加头文件路径
在 MDK 工程中添加 FreeRTOS 的头文件路径,以确保所有相关文件都能被正确引用。
10. 修改中断服务函数
将 PendSV_Handler
和 SVC_Handler
两个中断服务函数修改为 FreeRTOS 提供的 xPortPendSVHandler
和 vPortSVCHandler
。
有两种方法可以实现:
-
直接修改启动文件内的两个中断服务函数名为
xPortPendSVHandler
和vPortSVCHandler
。
-
将
xPortPendSVHandler
和vPortSVCHandler
重定义为PendSV_Handler
和SVC_Handler
。
如果选择第二种方式,并且使用 CubeMX 生成的工程,那么需要在 stm32f10x_it.c
文件内将 PendSV_Handler
和 SVC_Handler
两个中断函数注释掉,否则会报多重定义的错误。这里我们使用第二种方式:
主要是函数声明类型跟 INIT_xxx_EXPORT 要求的不一样,将函数返回值由 void 修改为 int 即可,当然函数内亦需要按实际情况 return 一个值。
11. 添加时钟中断服务函数
将 FreeRTOS 的时钟中断服务函数 xPortSysTickHandler
添加到 SysTick_Handler
函数中。可以参考 此链接 获取更多信息。
12. 添加头文件到主文件
将 FreeRTOS.h
和 task.h
头文件添加到 main.h
文件中,以确保主文件能够正确引用 FreeRTOS 相关功能。
13. 创建任务
根据 API 文档 或在 task.h
文件中找到静态创建线程(任务)的接口,创建一个任务。
14. 编译提示错误
在编译过程中,如果出现错误:
可以查看 xTaskCreateStatic
函数的定义,发现函数被一个宏 configSUPPORT_STATIC_ALLOCATION
包裹:
且该宏默认关闭:
15. 启用宏定义
在 FreeRTOSConfig.h
头文件中启用 configSUPPORT_STATIC_ALLOCATION
宏定义,以支持静态内存分配。
#define configSUPPORT_STATIC_ALLOCATION 1
16. 添加缺失函数
如果编译过程中提示缺少 vApplicationGetIdleTaskMemory
函数的定义:
查看该函数,发现只有 extern
声明,并没有实现:
尝试添加该函数的空实现,编译则不再报错:
研究其作用,该函数用于为空闲任务分配任务堆栈及任务控制块的内存,添加相应的功能实现:
编译成功!
17. 添加调试信息
在任务内添加调试信息输出以验证任务的正确性:
编译烧写后,每秒输出一次调试信息:
18. 新建自定义线程文件 mythread.c
新建一个 mythread.c
文件,用于声明和实现动态/静态创建任务。
动态创建任务:
19. 创建动态线程
在 AppTasksCreate
任务内创建动态线程。
20. 编译验证动态创建的任务
编译烧写程序,验证动态线程的正常运行。
21. 创建静态线程
额外创建一个静态线程,与动态线程一起运行,实现多任务调度。
在 AppTasksCreate
任务内创建静态线程:
22. 最终验证
编译烧写程序,验证动态和静态线程的正常运行,确保多任务调度的实现。
以上步骤完成后,您将成功配置和运行 FreeRTOS,并且能够在项目中实现动态和静态创建任务、多任务调度。如果在过程中遇到问题,可以参考相关文档或社区资源进行进一步的了解和解决。希望这篇教程对您有所帮助,祝您在使用 FreeRTOS 时顺利、高效!
对应的 demo 源码, 请点击 RtosExPro at freertos_try_to_experience
也可扫码关注博主同名公众号"不解之榬",回复 “freertos” 获取