Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FreeRTOS移植-基于STM32F407

FreeRTOS移植-基于STM32F407

作者头像
xxpcb
发布于 2020-08-04 08:39:58
发布于 2020-08-04 08:39:58
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
......(省略显示若干行)
FreeRTOS\portable\RVDS\ARM_CM4F\port.c: 0 warnings, 1 error
compiling heap_4.c...
.\FreeRTOS\include\FreeRTOS.h(98): error:  #5: cannot open source input file "FreeRTOSConfig.h": No such file or directory
  #include "FreeRTOSConfig.h"
FreeRTOS\portable\MemMang\heap_4.c: 0 warnings, 1 error
".\Objects\Template_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次编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
......(省略显示若干行)
compiling tasks.c...
compiling timers.c...
compiling port.c...
FreeRTOS\portable\RVDS\ARM_CM4F\port.c(713): error:  #20: identifier "SystemCoreClock" is undefined
                
ortNVIC_SYSTICK_LOAD_REG = ( 
onfigSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
FreeRTOS\portable\RVDS\ARM_CM4F\port.c: 0 warnings, 1 error

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifdef __ICCARM__
    #include <stdint.h>
    extern uint32_t SystemCoreClock;
#endif

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

将条件编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifdef __ICCARM__

修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)

再次进行第3次编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
......(省略显示若干行)
compiling port.c...
compiling heap_4.c...
linking...
.\Objects\Template_FreeRTOS.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o).
.\Objects\Template_FreeRTOS.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o).
.\Objects\Template_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.
".\Objects\Template_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行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 \* @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次编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
......(省略显示若干行)
linking...
.\Objects\Template_FreeRTOS.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
.\Objects\Template_FreeRTOS.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
.\Objects\Template_FreeRTOS.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).
.\Objects\Template_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.
".\Objects\Template_FreeRTOS.axf" - 4 Error(s), 0 Warning(s).

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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次编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
......(省略显示若干行)
compiling port.c...
compiling heap_4.c...
linking...
Program Size: Code=1880 RO-data=424 RW-data=68 ZI-data=2036  
".\Objects\Template_FreeRTOS.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:01

终于编译ok了,这样基本上算移植成功了,下一篇写个FreeRTOS的基础例程测试一下是否可以正常使用。获取本文用到的工程代码: 微信公众号回复“freertos工程模板”压缩包内有3个文件夹: 1. Template_lib:建立工程需要的库文件,包括STM32库文件(v1.4.0)和FreeRTOS库文件(v9.0.0) 2. Template_noOS:基于Keil5.15的STM32F407工程模板(未使用FreeRTOS) 3. Template_FreeRTOS:基于Keil5.15的STM32F407 + FreeRTOS工程模板

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农爱学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验
本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以查看文章的 目录列表,目录列表页面地址:https://blog.csdn.net/thisway_diy/article/details/121399484
韦东山
2021/12/08
2K0
韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验
FreeRTOS的移植(STM32F103)
笔者最近在学习FreeRTOS实时操作系统,准备开一个专题,记录学习内核的一些心得。学习RTOS的第一步就是将操作系统移植适配到我们的硬件平台,FreeRTOS作为一款完全开源且免费的实时操作系统,非常适合新手学习。笔者使用的是STM32F103Z8T6核心板,移植的FreeRTOS的版本为V10.5.1。
HaloMay
2025/06/13
4590
FreeRTOS系列第6篇---FreeRTOS内核配置说明
FreeRTOS内核是高度可定制的,使用配置文件FreeRTOSConfig.h进行定制。每个FreeRTOS应用都必须包含这个头文件,用户根据实际应用来裁剪定制FreeRTOS内核。
李肖遥
2020/06/24
3.5K0
FreeRTOS系列第6篇---FreeRTOS内核配置说明
FreeRTOS | STM32F407 FreeRTOS移植(第十四天)
【超级会员V1】通过百度网盘分享的文件:FreeRTOS 链接:https://pan.baidu.com/s/1MaoISeHM4M68gN3LQUOHaA?pwd=68Hh 提取码:68Hh 复制这段内容打开「百度网盘APP 即可获取」
Qt历险记
2024/10/20
8180
FreeRTOS | STM32F407 FreeRTOS移植(第十四天)
M-Arch(13)兼容FreeRTOS:让freeRTOS跑起来先
回顾下之前的章节:我们在一个简单的定时器 OS 基础上实现了 cortex-M 系列架构的兼容,并基于单片机的基本资源实现了很多实例。
滚神大人
2022/01/04
1.2K0
M-Arch(13)兼容FreeRTOS:让freeRTOS跑起来先
FreeRTOS系列第7篇---Cortex-M内核使用FreeRTOS特别注意事项
在阅读本文之前,有两个定义在FreeRTOSConfig.h中的宏,你必须先明白它们是什么意思,《FreeRTOS内核配置说明》一文中,讲解了这两个宏:
李肖遥
2020/07/16
1.4K0
FreeRTOS系列第7篇---Cortex-M内核使用FreeRTOS特别注意事项
移植FreeRTOS到小熊派开发板(STM32L431RCT6)
FreeRTOS源码分为两种,一种是FreeRTOS包,另一种是FreeRTOS LTS Release包。
Mculover666
2021/04/16
1.9K0
移植FreeRTOS到小熊派开发板(STM32L431RCT6)
使用STM32CubeMX创建FreeRTOS项目
STM32CubeMX是被广泛使用的。它集成了芯片选型、引脚分配和功能配置,中间件配置,时钟配置,初始代码和项目的功能。
跋扈洋
2022/12/03
1.3K0
使用STM32CubeMX创建FreeRTOS项目
FreeRTOS介绍与源码结构分析
FreeRTOS,全称Free Real Time Operating System,即免费的实时操作系统。相比于计算机中用到的Windows,MacOS,Linux等操作系统,实时操作系统(RTOS)是一种轻量级的操作系统,适用于嵌入式硬件中,用于解决单片机类裸机轮询方式在处理多个任务时的实时性不高的问题。
xxpcb
2020/08/04
2.4K0
FreeRTOS介绍与源码结构分析
【STM32F407】第4章 RTX5操作系统移植(MDK AC5)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=93149 第4章 RTX5操作系统移植(MDK AC5) 本章教程为
Simon223
2021/03/11
7060
【STM32F407】第4章   RTX5操作系统移植(MDK AC5)
TencentOS tiny 移植到STM32F103全教程(基于标准库)
STM32的裸机工程模板直接使用野火STM32开发板配套的固件库例程即可。可以从我github上获取https://github.com/jiejieTop/TencentOS-Demo
杰杰
2019/09/20
3.1K2
TencentOS tiny 移植到STM32F103全教程(基于标准库)
FreeRTOS | 原理介绍和资源get(第十四天)
l文档齐全。在FreeRTOS官方网站上,可以找到所有你需要的资料。 l免费、开放源码。完全可以免费用于商业产品,开放源码更便于学习操作系统原理、从全局掌握FreeRTOS运行机理、以及对操作系统进行深度裁剪以适应自己的硬件。 l2017年底,FreeRTOS作者加入亚马逊,担任首席工程师,FreeRTOS也由亚马逊管理。同时修改了用户许可证,FreeRTOS变得更加开放和自由。背靠亚马逊,相信未来FreeRTOS会更加稳定可靠。此外,以前价格不菲的《实时内核指南》和《参考手册》也免费开放下载,这使得学习更加容易。
Qt历险记
2024/10/19
5680
FreeRTOS | 原理介绍和资源get(第十四天)
STM32-FreeRTOS快速学习之总结1
1. 基础知识 注意:在RTOS中是优先值越高则优先级越高(和ucos/linux的相反) 在移植的时候,主要裁剪FreeRTOS/Source/portable文件夹,该文件夹用来针对不同MCU做的一些处理,如下图所示,我们只需要使用:
诺谦
2019/05/24
1.6K0
M-Arch(雅特力M4)【AT-START-F425测评】No.02 AT32F425开发环境搭建
之前在M-Arch中弄过STM32的M3,GD32的M4和M23,搭环境就顺风顺水了。
滚神大人
2022/04/18
5110
M-Arch(雅特力M4)【AT-START-F425测评】No.02 AT32F425开发环境搭建
移植RTOS时需要注意的常见错误
移植实时操作系统(RTOS)到新的硬件平台是嵌入式开发中的一项关键任务。无论是将FreeRTOS移植到STM32,还是将其他RTOS适配到定制硬件,开发者都可能遇到一系列挑战。
不脱发的程序猿
2025/05/17
2320
移植RTOS时需要注意的常见错误
FreeRTOS内核应用开发手记
FreeRTOS内核应用开发学习手记移植任务状态迁移任务创建与删除任务挂起与恢复任务延时消息队列信号量事件软件定时器任务通知内存管理
小锋学长生活大爆炸
2020/08/13
6930
FreeRTOS内核应用开发手记
【STM32F407】第4章 RL-USB移植(MDK AC5)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710 第4章 RL-USB移植(MDK AC5) 本章教程为大家
Simon223
2021/03/02
4840
【STM32F407】第4章   RL-USB移植(MDK AC5)
FreeRTOS(三)
博主手里有一个正点原子 STM32F103ZET6,行情最贵的时候买的,得好好利用。
Jasonangel
2021/12/01
1.3K0
FreeRTOS(三)
FreeRTOS(十六):低功耗 Tickless 模式
很多应用场合对于功耗的要求很严格,比如长期无人照看的数据采集仪器,可穿戴设备等。其实很多 MCU 都有相应的低功耗模式,以此来降低设备运行时的功耗,进行裸机开发的时候就可以使用这些低功耗模式。但是现在我们要使用操作系统,因此操作系统对于低功耗的支持也显得尤为重要,这样硬件与软件相结合,可以进一步降低系统的功耗。这样开发也会方便很多,毕竟系统已经原生支持低功耗了,我们只需要按照系统的要求来做编写相应的应用层代码即可。FreeRTOS 提供了一个叫做 Tickless 的低功耗模式。
Jasonangel
2022/04/07
4.2K2
FreeRTOS(十六):低功耗 Tickless 模式
STM32f407程序移植到GD32F407
根据电路设计,外部使用8M,通过PLL到168M因此在sys_gd32f4xx.c文件中选择宏定义:
ManInRoad
2021/04/16
7.6K0
相关推荐
韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档