基于STM32F4单片机的FreeRTOS移植思路及过程

📅 2026/8/27 15:37:23
基于STM32F4单片机的FreeRTOS移植思路及过程
一 、FreeRTOS 简介官网https://www.freertos.org/zh-cn-cmn-sFreeRTOS 是一款开源的实时操作系统RTOS专为嵌入式系统设计。其核心特点包括轻量级、可移植性强、支持多任务调度适用于资源受限的硬件环境。FreeRTOS 遵循 MIT 开源协议允许商业应用无需支付授权费用。核心功能多任务管理支持基于优先级的抢占式调度允许任务动态创建和删除。内存管理 提供多种内存分配方案如 heap_1 至 heap_5适应不同硬件资源需求。同步与通信包含队列、信号量、互斥锁等机制支持任务间高效通信。低功耗支持提供 Tickless 模式减少空闲任务时的 CPU 功耗。二 、rtos移植(1)、下载1、官网github下载官网下载地址https://www.freertos.org/zh-cn-cmn-s/Documentation/02-Kernel/01-About-the-FreeRTOS-kernel/03-Download-freeRTOS/01-DownloadFreeRTOS进入之后下拉可以找到不同的版本若需要之前的版本可以点击下图所示的位置进行跳转跳转之后进入到github页面点击tags进入到这个页面后可以看到不同的版本如果没有我们需要的可以点击最下面的 next按钮本文需要的v10.2.1版本在后面第二页或者第三页的位置找到需要的版本后点击跳转到新页面选择要下载的压缩方式点击就会开始下载下载完成后进行解压解压位置自行决定使用完就可以删除了2、代码托管平台下载代码托管网站https://sourceforge.net/projects/freertos/files/FreeRTOS/进入之后我们可以直接看到很多个版本我们选择对应的版本点击后点击对应的压缩包稍等片刻就会下载。(2)、文件移植结束后我们就会得到如下的一个文件夹进入到下图对应的文件目录下包括三个部分第一部分和第三部分包含的是FreeRTOS的通用的头文件和C文件这两部分的文件是通用的试用于各种编译器和处理器。第二部分portable是与编译器相关的文件夹在不同的编译器中需要使用不同的支持文件。我们在自己的工程文件目录下新建一个FreeRTOS文件夹在FreeRTOS文件夹下面新建如下图所示的几个文件夹。将上述的include文件夹和下面的文件复制到新建的文件夹下其中include存放的是上述第一部分include文件src存放的是上图第三部分所有的.c文件我们点击上述的第二部分portable文件夹进入之后可以看到我们熟悉的keil但是这个文件夹是空的让我们参考RVDS文件夹。打开RVDS文件夹后可以看到不同内核的文件夹我是以stm32f407为例子所以选择的是m4内核f407vet6带有浮点运算所以选择红色框内的。如果是其他系列的点击对应的文件夹。例如stm32f103则选择M3内核的文件夹将其中的.c文件和.h文件复制到我们在工程中建的FreeRTOS文件夹下port文件夹中即可。复制之后回到portable文件夹下面点击MemMang可以看到有五种方式heap_1-- 最简单不允许释放内存。heap_2-- 允许释放内存但不会合并相邻的空闲块。heap_3-- 简单包装了标准 malloc() 和 free()以保证线程安全。heap_4-- 合并相邻的空闲块以避免碎片化。包含绝对地址放置选项,heap_5-- 如同 heap_4能够跨越多个不相邻内存区域的堆。这里我们选择heap_4.c文件复制后放入到我们工程中port文件夹下此时port文件夹如下接着我们回到下图对应的文件目录下找到对应的stm32F407。如果是其他系列单片机在文件中找到对应的文件夹点进去即可下面操作步骤一样点击之后将下图红框的文件复制粘贴到我们工程下建的FreeRTOS文件夹下此时我们的文件已经齐全了(3)、keil中配置打开工程在三色盒子中创建两个文件夹FreeRTOS/srcFreeRTOS/port。其中src包含所有的.c文件port包含如下图所示文件完成点击魔法棒按下图所示包含.h文件我们再编译一下发现有以下错误..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c(788): error: #20: identifier SystemCoreClock is undefined此时我们需要修改为如下图所示#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)改完后有以下报错这个报错是因为在port.c 和stm32f4xx_it.c文件中出现重复定义的函数SVC_Handler、SysTick_Handler、 PendSV_Handler。..\OBJ\MALLOC.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o)...\OBJ\MALLOC.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o)...\OBJ\MALLOC.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by port.o and stm32f4xx_it.o).我们将stm32f4xx_it.c中这三个函数直接注释掉再编译。其他系列单片机找到对应的中断.c文件即可内容一样接下来出现如下错误。这是由于没有定义这些函数而导致的这些未定义的函数它们都是Hook 结尾的这些函数有个共同的名称:钩子函数。将相应的宏定义改为0即可。..\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o)...\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o)...\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o)...\OBJ\MALLOC.axf: Error: L6218E: Undefined symbol vApplicationMallocFailedHook (referred from heap_4.o).这里将下列宏定义为 0confiUSE IDLE HOOK、confgUSE TICK HOOKconfigCHECK FOR STACK OVERFLOWconfigUSE MALLOC FAILED HOOK最后编译一下应该就没有错误了图片中我已经修改了部分参数但不影响观看(4)、编写任务测试运行移植过程如果还有错误的话可以自行根据错误类型处理也可以评论区进行讨论一下。博主看到会及时回复后续有什么错误我会及时更新。