0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS移植-基于STM32F407

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-09-26 09:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

首先新建或找一个基于KeilSTM32基础工程,这里我已经创建好了一个STM32F407VET6的工程模板,工程结构如下图的第1步的矩形框内所示。

下面需要移植FreeRTOS了,将FreeRTOS的源码文件复制到工程文件夹中,一些用不到的文件可删除(哪些文件需要用到可参考上一篇的源码结构分析部分),然后在Keil中也创建一个FreeRTOS目录,将c文件添加进工程,注意port.c来自于RDVS的ARM_CM4F,对应于移植到的SMT32F407硬件。

pYYBAGMwZUKAX7uvAAFlVsw-sV4348.png

添加完c文件后,还要添加对应的h文件的搜寻路径,具体如下:

pYYBAGMwZUqAS2GcAAFgX5g1DDY177.png

然后就可以编译了,先进行第1次编译:

......(省略显示若干行)
FreeRTOSportableRVDSARM_CM4Fport.c: 0 warnings, 1 error
compiling heap_4.c...
.FreeRTOSincludeFreeRTOS.h(98): error:  #5: cannot open source input file "FreeRTOSConfig.h": No such file or directory
  #include "FreeRTOSConfig.h"
FreeRTOSportableMemMangheap_4.c: 0 warnings, 1 error
".ObjectsTemplate_FreeRTOS.axf" - 8 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:23

有一个错误,找不到"FreeRTOSConfig.h",这个文件在FreeRTOS源码的Demo文件中,

将Demo中的"FreeRTOSConfig.h"文件放到FreeRTOS文件夹下的include文件夹下, 进行第2次编译:

......(省略显示若干行)
compiling tasks.c...
compiling timers.c...
compiling port.c...
FreeRTOSportableRVDSARM_CM4Fport.c(713): error:  #20: identifier "SystemCoreClock" is undefined
                
ortNVIC_SYSTICK_LOAD_REG = ( 
onfigSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
FreeRTOSportableRVDSARM_CM4Fport.c: 0 warnings, 1 error

又提示"SystemCoreClock" 未定义,因为在"FreeRTOSConfig.h" : 中使用了SysyemCoreClock来标记MCU的频率,

在"FreeRTOSConfig.h" :的87~95行:

#ifdef __ICCARM__
	#include 
	extern uint32_t SystemCoreClock;
#endif

#define configUSE_PREEMPTION			1
#define configUSE_IDLE_HOOK				1
#define configUSE_TICK_HOOK				1
#define configCPU_CLOCK_HZ				( SystemCoreClock )

将条件编译

#ifdef __ICCARM__

修改为

#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)

再次进行第3次编译:

......(省略显示若干行)
compiling port.c...
compiling heap_4.c...
linking...
.ObjectsTemplate_FreeRTOS.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o).
.ObjectsTemplate_FreeRTOS.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o).
.ObjectsTemplate_FreeRTOS.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by port.o and stm32f4xx_it.o).
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 0 warning and 3 error messages.
".ObjectsTemplate_FreeRTOS.axf" - 3 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:02

又提示port.o与stm32f4xx_it.o有重复定义(.o为编译的目标文件,其实就是对应的.c文件出了问题)

注释掉stm32f4xx_it.c中的SVC_Handler() PendSV_Handler() SysTick_Handler()即可

修改后的stm32f4xx_it.c的110~145行:

/**
 * @brief This function handles SVCall exception.
 * @param None
 * @retval None
 */
//void SVC_Handler(void)
//{
//}

/**
 * @brief This function handles Debug Monitor exception.
 * @param None
 * @retval None
 */
void DebugMon_Handler(void)
{
}

/**
 * @brief This function handles PendSVC exception.
 * @param None
 * @retval None
 */
//void PendSV_Handler(void)
//{
//}

/**
 * @brief This function handles SysTick Handler.
 * @param None
 * @retval None
 */
//void SysTick_Handler(void)
//{
// 
//}

再次进行第4次编译:

......(省略显示若干行)
linking...
.ObjectsTemplate_FreeRTOS.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
.ObjectsTemplate_FreeRTOS.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
.ObjectsTemplate_FreeRTOS.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).
.ObjectsTemplate_FreeRTOS.axf: Error: L6218E: Undefined symbol vApplicationMallocFailedHook (referred from heap_4.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 4 error messages.
".ObjectsTemplate_FreeRTOS.axf" - 4 Error(s), 0 Warning(s).

又提示4个hook函数未定义,

这是因为在"FreeRTOSConfig.h"中定义了这些钩子函数,但未找到函数定义,我们先注释掉这些定义,

就是将configUSE_IDLE_HOOK之类的宏定义定义为0即可,

查看"FreeRTOSConfig.h"的93~108行:

#define configUSE_IDLE_HOOK				1
#define configUSE_TICK_HOOK				1
#define configCPU_CLOCK_HZ				( SystemCoreClock )
#define configTICK_RATE_HZ				( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES			( 5 )
#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 75 * 1024 ) )
#define configMAX_TASK_NAME_LEN			( 10 )
#define configUSE_TRACE_FACILITY		1
#define configUSE_16_BIT_TICKS			0
#define configIDLE_SHOULD_YIELD			1
#define configUSE_MUTEXES				1
#define configQUEUE_REGISTRY_SIZE		8
#define configCHECK_FOR_STACK_OVERFLOW	2
#define configUSE_RECURSIVE_MUTEXES		1
#define configUSE_MALLOC_FAILED_HOOK	1

修改93 94 106 108行的数值为0,即:

#define configUSE_IDLE_HOOK				0
#define configUSE_TICK_HOOK				0
......(省略显示11行)
#define configCHECK_FOR_STACK_OVERFLOW	0
......(省略显示1行)
#define configUSE_MALLOC_FAILED_HOOK	0

再次进行第5次编译:

......(省略显示若干行)

compiling port.c...

compiling heap_4.c...

linking...

Program Size: Code=1880 RO-data=424 RW-data=68 ZI-data=2036 

".ObjectsTemplate_FreeRTOS.axf" - 0 Error(s), 0 Warning(s).

Build Time Elapsed:  00:00:01

终于编译ok了,这样基本上算移植成功了。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20143

    浏览量

    328669
  • FreeRTOS
    +关注

    关注

    14

    文章

    497

    浏览量

    66327
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FreeRTOS移植STM32F407

    FreeRTOS,接下来我们就把FreeRTOS移植到我们所使用的平台上,我们使用的板子是STM32F407。02. 预备工作要移植
    发表于 08-24 06:07

    如何使用STM32F407移植FreeRTOS

    如何使用STM32F407移植FreeRTOS呢?有哪些操作步骤?
    发表于 10-21 09:45

    STM32F407 FreeRTOS开发指南

    参考资料:正点原子《littleVGL 开发指南》正点原子《STM32F407 FreeRTOS 开发指南》硬件平台:stm32f407开发板(或最小系统)、4.3寸TFTLCD以正点原子的例程为
    发表于 01-05 06:55

    STM32F407模板

    STM32F407模板,感兴趣可以看看。
    发表于 07-25 18:52 157次下载

    STM32F407 UCOS III实验

    STM32F407 UCOS III实验,介绍基于STM32F407的UCOSIII实例,参考下
    发表于 09-22 14:08 82次下载

    STM32F407 DCMI摄像头源码

    STM32F407 DCMI摄像头源码(电源技术存在的问题总结)-【资源描述】:STM32F407 DCMI摄像头源码【编程语言】:C语言
    发表于 09-16 16:15 134次下载
    <b class='flag-5'>STM32F407</b> DCMI摄像头源码

    STM32F407的串口UART 基础配置STM32CubeMX

    STM32F407的串口UART 基础配置STM32CubeMX
    发表于 11-29 16:06 56次下载
    <b class='flag-5'>STM32F407</b>的串口UART 基础配置<b class='flag-5'>STM32</b>CubeMX

    STM32F407芯片介绍

    1. 文档准备做嵌入式开发的第一步就是了解主芯片,了解STM32F407主要要关注几个文档:1. stm32F407芯片手册2. stm32F407参考手册3. Arm Cortex-M4数据手册
    发表于 12-04 13:21 109次下载
    <b class='flag-5'>STM32F407</b>芯片介绍

    FreeRTOS-stm32f407移植

    FreeRTOS-stm32f407移植需要准备的内容FreeRTOS移植步骤1、添加FreeRTOS源码1)复制源码内容2)删除porta
    发表于 12-04 13:36 9次下载
    <b class='flag-5'>FreeRTOS-stm32f407</b><b class='flag-5'>移植</b>

    STM32CubeIDE 中针对 STM32F407 移植 ThreadX

    STM32CubeIDE 中针对 STM32F407 移植 ThreadX,不依赖盗版破解的Keil MDK、IAR等软件。
    发表于 12-04 13:36 18次下载
    在 <b class='flag-5'>STM32</b>CubeIDE 中针对 <b class='flag-5'>STM32F407</b> <b class='flag-5'>移植</b> ThreadX

    STM32FreeRTOS移植

    FreeRTOS,接下来我们就把FreeRTOS移植到我们所使用的平台上,我们使用的板子是STM32F407。02. 预备工作要移植
    发表于 12-04 14:06 15次下载
    【<b class='flag-5'>STM32</b>】<b class='flag-5'>FreeRTOS</b><b class='flag-5'>移植</b>

    STM32F407原理图下载

    STM32F407原理图下载
    发表于 01-17 13:44 457次下载

    stm32f407原理图

    stm32f407原理图
    发表于 07-14 16:07 247次下载

    STM32F407 FreeRTOS开发手册 V1.1

    STM32F407 FreeRTOS开发手册_V1.1PDF文件下载。
    发表于 07-31 11:16 80次下载

    STM32F407+FreeRTOS+LWIP1.4.1移植问题记录

    最近在学习物联网相关的知识,打算用ST的开发板STM32F407ZGT6作为控制中心,上面搭载FreeROTS实时系统,STM32F407开发板作为 TCP client
    的头像 发表于 07-21 14:09 5436次阅读
    <b class='flag-5'>STM32F407+FreeRTOS</b>+LWIP1.4.1<b class='flag-5'>移植</b>问题记录