打印
[STM32F4]

FreeRTOS-stm32f407移植

[复制链接]
2804|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxs0026|  楼主 | 2022-11-15 23:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
需要准备的内容
  • 一个stm32f407的基础工程
  • FreeRTOS 系统源码
FreeRTOS移植步骤 1、添加FreeRTOS源码
添加FreeRTOS源码 1.1复制源码内容 在基础工程中新建一个名为FreeRTOS的文件夹



使用特权

评论回复
评论
lxs0026 2022-11-18 12:23 回复TA
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_32761549/article/details/105616066 ———————————————— 版权声明:本文为CSDN博主「月照银海似蛟龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_32761549/article/details/105616066 
沙发
lxs0026|  楼主 | 2022-11-15 23:19 | 只看该作者
FreeRTOS的源码 路径为

放入后如下图

使用特权

评论回复
板凳
lxs0026|  楼主 | 2022-11-15 23:28 | 只看该作者
删除portable文件夹下的部分内容

其中的portable文件夹下的内容有些可以删掉
有这么多内容

使用特权

评论回复
地板
lxs0026|  楼主 | 2022-11-15 23:31 | 只看该作者
只需要留下Keil、MenMang、RVDS这个三个文件夹,其它的都可以删掉
处理后如下

使用特权

评论回复
5
lxs0026|  楼主 | 2022-11-15 23:40 | 只看该作者
向工程分组中添加文件

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

在 FreeRTOS_CORE 的组中添加的文件就在工作新建的FreeRTOS的文件夹下,如下添加就行

使用特权

评论回复
6
lxs0026|  楼主 | 2022-11-15 23:41 | 只看该作者
在 FreeRTOS_PORTABLE 组下添加 port.c文件和heap_4.c文件

    poct.c文件选择:
    stm32f407是Cortex-M4内核并且带有FPU。poct.c在 portabl/RVDS 文件夹下,该文件夹下有ARM的不同内核的文件夹,因为是stm32f407顾选择ARM_CM4F的文件夹下的poct.c

使用特权

评论回复
7
lxs0026|  楼主 | 2022-11-15 23:42 | 只看该作者
heap_4.c文件选择:
该文件位置在 portabl/MemMang 文件夹下(MemMang是内存管理相关的),下面有

有5个文件,是5种内存管理的方法。实现原理不同,各有利弊

使用特权

评论回复
8
lxs0026|  楼主 | 2022-11-15 23:43 | 只看该作者
添加完工程如下图

使用特权

评论回复
9
lxs0026|  楼主 | 2022-11-15 23:44 | 只看该作者
添加相应的头文件路径

添加完FreeRTOS源码中的C文件以后还要添加FreeRTOS源码的头文件路径。

添加下面两个路径

使用特权

评论回复
10
lxs0026|  楼主 | 2022-11-15 23:44 | 只看该作者
添加FreeRTOSConfig.h文件

编译下
报错 缺少FreeRTOSConfig.h文件

从FreeRTOS的官方移植工程中找个针对STM32F407的移植工程 中,把FreeRTOSConfig.h这个文件复制过来。放FreeRTOS\include文件夹下

    FreeRTOSConfig.h 是FreeRTOS的配置文件,FreeRTOS的系统剪裁和配置功能通过这个文件来完成,基本都是通过宏定义来完成对系统的配置和剪裁。

使用特权

评论回复
11
lxs0026|  楼主 | 2022-11-15 23:45 | 只看该作者
定义 SystemCoreClock

再次编译

SystemCoreClock未定义,这个错误 不好找,因为 进行了几次宏定义的 根本在FreeRTOSConfig.h文件中
在FreeRTOSConfig.h 中使用 SystemCoreClock 来标记MCU的频率。

使用特权

评论回复
12
lxs0026|  楼主 | 2022-11-15 23:46 | 只看该作者
看下这部分代码

修改这个 条件编译

// #ifdef __ICCARM__
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)

使用特权

评论回复
13
lxs0026|  楼主 | 2022-11-15 23:47 | 只看该作者
修改重复定义函数

再编译
有重复定义的函数 SysTick_Handler 、PendSV_Handler 、SVC_Handler
在port.c和stm32f4xx_it.c这两个文件中 重复定义了函数

..\OBJ\LED.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by port.o and stm32f4xx_it.o).
..\OBJ\LED.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o).
..\OBJ\LED.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o).

使用特权

评论回复
14
lxs0026|  楼主 | 2022-11-15 23:48 | 只看该作者
注释掉stm32f4xx_it.c 文件里的

使用特权

评论回复
15
lxs0026|  楼主 | 2022-11-15 23:58 | 只看该作者
关闭相关函数功能

再编译
还报错
未定义一些函数

..\OBJ\LED.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
..\OBJ\LED.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
..\OBJ\LED.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).
..\OBJ\LED.axf: Error: L6218E: Undefined symbol vApplicationMallocFailedHook (referred from heap_4.o).

使用特权

评论回复
16
lxs0026|  楼主 | 2022-11-17 10:38 | 只看该作者
注意他们都是Hook结尾的函数,即为钩子函数,在FreeRTOSConfig.h中开启了该函数但是没有定义,在里面关闭就行了。将相应宏定义改为0
该之前

使用特权

评论回复
17
lxs0026|  楼主 | 2022-11-17 10:39 | 只看该作者
改这四个的宏为0
configUSE_IDLE_HOOK
configUSE_TICK_HOOK
configUSE_MALLOC_FAILED_HOOK
configCHECK_FOR_STACK_OVERFLOW

使用特权

评论回复
18
lxs0026|  楼主 | 2022-11-17 10:39 | 只看该作者
改之后

再编译就没问题了

使用特权

评论回复
19
lxs0026|  楼主 | 2022-11-17 10:42 | 只看该作者
修改SYSTEM文件

SYSTEM文件夹里面的文件一开始是正点原子针对UCOS编写的。使用FreeRTOS需要做相应的修改。

使用特权

评论回复
20
lxs0026|  楼主 | 2022-11-17 10:49 | 只看该作者
修改sys.h文件
sys.h 文件里面用宏 SYSTEM_SUPPORT_OS 来定义是否使用OS。使用FreeRTOS的话要打开,设置为1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

1051

帖子

1

粉丝