[STM32F4] FreeRTOS-stm32f407移植

[复制链接]
3352|41
 楼主| lxs0026 发表于 2022-11-15 23:16 | 显示全部楼层 |阅读模式
需要准备的内容
  • 一个stm32f407的基础工程
  • FreeRTOS 系统源码
FreeRTOS移植步骤 1、添加FreeRTOS源码
添加FreeRTOS源码 1.1复制源码内容 在基础工程中新建一个名为FreeRTOS的文件夹
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyNzYxNTQ5,size_16,color_FFFFFF,t_70.jpg


评论

版权声明:本文为博主原创文章,遵循 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/deta  发表于 2022-11-18 12:23
 楼主| lxs0026 发表于 2022-11-15 23:19 | 显示全部楼层
FreeRTOS的源码 路径为
663966373ae0b05ff1.png
放入后如下图
480546373ae11d88b7.png
 楼主| lxs0026 发表于 2022-11-15 23:28 | 显示全部楼层
删除portable文件夹下的部分内容

其中的portable文件夹下的内容有些可以删掉
有这么多内容
323506373b010ef316.png
 楼主| lxs0026 发表于 2022-11-15 23:31 | 显示全部楼层
只需要留下Keil、MenMang、RVDS这个三个文件夹,其它的都可以删掉
处理后如下
7646373b0ebe237b.png
 楼主| lxs0026 发表于 2022-11-15 23:40 | 显示全部楼层
向工程分组中添加文件

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

在 FreeRTOS_CORE 的组中添加的文件就在工作新建的FreeRTOS的文件夹下,如下添加就行
126456373b2f8c8214.png
 楼主| 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
346646373b340e1a6b.png
 楼主| lxs0026 发表于 2022-11-15 23:42 | 显示全部楼层
heap_4.c文件选择:
该文件位置在 portabl/MemMang 文件夹下(MemMang是内存管理相关的),下面有
779386373b36f1d3e8.png
有5个文件,是5种内存管理的方法。实现原理不同,各有利弊
 楼主| lxs0026 发表于 2022-11-15 23:43 | 显示全部楼层
添加完工程如下图
722716373b38089783.png
 楼主| lxs0026 发表于 2022-11-15 23:44 | 显示全部楼层
添加相应的头文件路径

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

添加下面两个路径
347696373b3bf441fc.png
 楼主| lxs0026 发表于 2022-11-15 23:44 | 显示全部楼层
添加FreeRTOSConfig.h文件

编译下
报错 缺少FreeRTOSConfig.h文件
957266373b3d8efadf.png
从FreeRTOS的官方移植工程中找个针对STM32F407的移植工程 中,把FreeRTOSConfig.h这个文件复制过来。放FreeRTOS\include文件夹下

    FreeRTOSConfig.h 是FreeRTOS的配置文件,FreeRTOS的系统剪裁和配置功能通过这个文件来完成,基本都是通过宏定义来完成对系统的配置和剪裁。
 楼主| lxs0026 发表于 2022-11-15 23:45 | 显示全部楼层
定义 SystemCoreClock

再次编译
892096373b422b4571.png
SystemCoreClock未定义,这个错误 不好找,因为 进行了几次宏定义的 根本在FreeRTOSConfig.h文件中
在FreeRTOSConfig.h 中使用 SystemCoreClock 来标记MCU的频率。
 楼主| lxs0026 发表于 2022-11-15 23:46 | 显示全部楼层
看下这部分代码
861566373b45930b75.png
修改这个 条件编译

// #ifdef __ICCARM__
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
 楼主| 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).
 楼主| lxs0026 发表于 2022-11-15 23:48 | 显示全部楼层
注释掉stm32f4xx_it.c 文件里的
 楼主| 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).
 楼主| lxs0026 发表于 2022-11-17 10:38 | 显示全部楼层
注意他们都是Hook结尾的函数,即为钩子函数,在FreeRTOSConfig.h中开启了该函数但是没有定义,在里面关闭就行了。将相应宏定义改为0
该之前
9421163759e9fc4cc1.png
 楼主| lxs0026 发表于 2022-11-17 10:39 | 显示全部楼层
改这四个的宏为0
configUSE_IDLE_HOOK
configUSE_TICK_HOOK
configUSE_MALLOC_FAILED_HOOK
configCHECK_FOR_STACK_OVERFLOW
 楼主| lxs0026 发表于 2022-11-17 10:39 | 显示全部楼层
改之后
4273963759ee0c2846.png
再编译就没问题了
 楼主| lxs0026 发表于 2022-11-17 10:42 | 显示全部楼层
修改SYSTEM文件

SYSTEM文件夹里面的文件一开始是正点原子针对UCOS编写的。使用FreeRTOS需要做相应的修改。
 楼主| lxs0026 发表于 2022-11-17 10:49 | 显示全部楼层
修改sys.h文件
sys.h 文件里面用宏 SYSTEM_SUPPORT_OS 来定义是否使用OS。使用FreeRTOS的话要打开,设置为1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

1290

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部