freeRTOS V10.0.1移植到STM32F407标准库

摘要:
然后在编译中出现以下错误。此时,应该使用FreeRTOS的一些演示程序来查找407_ M4F_ Copy FreeRTOSConfig的官方FreeRTOS v10.0.1 FreeRTOSDemoCORTEX迁移项目。h,在STM32F407ZG-SK下。

  最近因为工作需要用到FreeRTOS,其实开始本人内心是拒绝的因为自己只学习过UCOSIII还没实际上过什么大又复杂的工程,但是谁让FreeRTOS他是Free的呢公司成本考虑肯定是不会选择USOS的,这个道理就像公司内心深处不想给你涨工资一样。好了跑偏了言归正传,既然要用自然是要熟悉一下这个实时操作的内核的工作过程了,说道到里想起来自己当初学USOC时是把代码几乎进行了逐行的走读,最后因为各种原因都没能实际使用最后还是忘记了,所以我建议对于这一类的操作系统的学习还是重在API函数的用法学习上,不需要太对代码集体实现细节进行研究,时间成本高有这个时间建议移植一个系统进行一些应用实践是最有实际效果的。因此我现在就在践行自己的经验移植FreeRTOS到板子上学习,实际项目是用的STMF107系列的但是无奈手头上暂时只有F407,其实都是一样的,所以废话不多说了开始移植实操。

查找资料

通过网上查阅各位大神牛人的博客最后选择了如下两个文档:

1.FreeRTOS中文实用教程,这是英文原文下载地址http://www.FreeRTOS.org

2,STM32F429+FreeRTOS开发手册,这是原子哥的开源电子网上都可以下来,最后再补充一下FreeRTOS源码的下载地址https://jaist.dl.sourceforge.net/project/freertos/FreeRTOS/V10.0.1/FreeRTOSv10.0.1.exe

开始行动

1.找一个标准库的实例这里我也用的是原子哥的F407的标准工程,然后解压后的文件我们只用留下Sourceportable如下的代码因为我移植的工程是keil5的所以留下keil,但是这个文件夹其实没什么用(对于我下载到的版本)。其中RVDS文件夹下也只留下的目标板相关的ARM_CM4F  因为FreeRTOS这个版本已经支持F4的FPU

freeRTOS V10.0.1移植到STM32F407标准库第1张

到此源码处理完毕了接下来就是将源码加入到标准工程中去,注意将SYSTEM下的delay.c从工程删除。然后编译出现如下错误

freeRTOS V10.0.1移植到STM32F407标准库第2张

此时就要用到FreeRTOS的一些demo程序找到官方对于407的移植工程FreeRTOSv10.0.1FreeRTOSDemoCORTEX_M4F_STM32F407ZG-SK下的FreeRTOSConfig.h拷贝到工程中。在编译又将看到如下错误

freeRTOS V10.0.1移植到STM32F407标准库第3张

打开FreeRTOSConfig.h可以看到这样一段代码

#ifdef __ICCARM__
    #include <stdint.h>
    extern uint32_t SystemCoreClock;
#endif

现在需要将其改成如下部分就可以去除这个错误

#if defined (__ICCARM__)||defined(__CC_ARM)||defined(__GNUC__)
    #include <stdint.h>
    extern uint32_t SystemCoreClock;
#endif

然后再编译就会发现新的错误:

Build target 'Template'
compiling main.c...
compiling croutine.c...
compiling event_groups.c...
compiling list.c...
compiling queue.c...
compiling stream_buffer.c...
compiling tasks.c...
compiling timers.c...
compiling port.c...
linking...
..OBJTemplate.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o).
..OBJTemplate.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o).
..OBJTemplate.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.
"..OBJTemplate.axf" - 3 Error(s), 0 Warning(s).
Target not created

  提示三个函数有重复定义,其中SysTick_Handler再FreeRTOS中被重新定义成系统心跳处理中断函数,PendSV_Handler,SVC_Handler也被在FreeRTOS中重新定义用于任务切换,所以需要注释掉stm32F4xxx_it.c中的这三个中断函数。接着编译错误如下

linking...
..OBJTemplate.axf: Error: L6218E: Undefined symbol pvPortMalloc (referred from event_groups.o).
..OBJTemplate.axf: Error: L6218E: Undefined symbol vPortFree (referred from event_groups.o).
..OBJTemplate.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
..OBJTemplate.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
..OBJTemplate.axf: Error: L6218E: Undefined symbol vApplicationTickHook (referred from tasks.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 5 error messages.
"..OBJTemplate.axf" - 5 Error(s), 0 Warning(s).
Target not created

  其中是先关HOOK钩子函数未定义错,在FreeRTOSConfig.h中改为如下

#define configUSE_PREEMPTION                        1//调度器采用抢占式还是协程式
#define configUSE_IDLE_HOOK                            0//空闲任务钩子函数
#define configUSE_TICK_HOOK                            0//时间片钩子函数
#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//空闲任务是否会为同等优先级的任务让出CPU使用权
#define configUSE_MUTEXES                                1
#define configQUEUE_REGISTRY_SIZE                8
#define configCHECK_FOR_STACK_OVERFLOW    0//堆栈溢出检测
#define configUSE_RECURSIVE_MUTEXES            1//递归互斥信号量
#define configUSE_MALLOC_FAILED_HOOK        0//内存分配失败钩子函数
#define configUSE_APPLICATION_TASK_TAG    0
#define configUSE_COUNTING_SEMAPHORES        1
#define configGENERATE_RUN_TIME_STATS        0//运行时间统计功能

在运行编译错误如下

linking...
..OBJTemplate.axf: Error: L6218E: Undefined symbol pvPortMalloc (referred from event_groups.o).
..OBJTemplate.axf: Error: L6218E: Undefined symbol vPortFree (referred from event_groups.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 2 error messages.
"..OBJTemplate.axf" - 2 Error(s), 0 Warning(s).
Target not created

  这一部分是我前面忘记加入内存管理函数文件导致的,在FreeRTOSv10.0.1FreeRTOSSourceportableMemMang目录下一共有5个内存管理的点C文件

freeRTOS V10.0.1移植到STM32F407标准库第4张

在这里我们选择4结尾的管理方式,其中具体各个文件的管理方法是什么暂时不求甚解。将heap_4.c加入到工程。编译

Build target 'Template'
compiling heap_4.c...
linking...
Program Size: Code=19344 RO-data=424 RW-data=160 ZI-data=78936  
FromELF: creating hex file...
"..OBJTemplate.axf" - 0 Error(s), 0 Warning(s).

  至此移植完成。具体配置后面再进行学习。https://github.com/Dazzingdusk/freeRTOS这里有我自己移植成功后,自己写的一消息对列的代码,其中驱动部分使用的是原子哥的例子中的代码。

免责声明:文章转载自《freeRTOS V10.0.1移植到STM32F407标准库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇执行js-----Selenium快速入门(十四)java日期格式大全 format SimpleDateFormat(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

FreeRTOS 任务与调度器(1)

 前言: Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容FreeRTOS文件如下: Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容 在开始介绍函数之前,首先我们先简单了解一下任务状态: •...

lwip TCP client 客户端 &amp;amp; FreeRTOS

static void tcpecho_thread(void *arg) { ip_addr_t serverIpAddr; struct netbuf *buf; void *data; u16_t len; err_t err; struct netconn *conn; IP4_ADDR(&serverIpA...

lwip TCP client &amp;amp; FreeRTOS 打开TCP 的 保活机制 LWIP_TCP_KEEPALIVE==1

参考大神教程:http://blog.sina.com.cn/s/blog_62a85b950101aw8x.html   老衲五木       :http://blog.sina.com.cn/s/blog_62a85b950102vrr4.html     老衲五木       :http://blog.csdn.net/zhzht19861011/a...

FreeRTOS再学习——2nd——信号量和优先级反转问题

信号量: 信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步,FreeRTOS中信号量又分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。 不同的信号量其应用场景不同,但有些应用场景是可以互换着使用的。 二值信号量只有0和1,表示信号量的两个状态,适用于立flag 信号量的另一个重要的应用场合就是任务同步,用于任务与任务或中断与...

FreeRTOS系列第20篇---FreeRTOS信号量API函数

FreeRTOS的信号量包括二进制信号量、计数信号量、相互排斥信号量(以后简称相互排斥量)和递归相互排斥信号量(以后简称递归相互排斥量)。我们能够把相互排斥量和递归相互排斥量看成特殊的信号量。 信号量API函数实际上都是宏。它使用现有的队列机制。这些宏定义在semphr.h文件里。假设使用信号量或者相互排斥量。须要包括semphr.h头文件。 二进制信...

[RTOS]--uCOS、FreeRTOS、RTThread、RTX等RTOS的对比之特点

本篇博客就来细数这几个RTOS的特点。   以下内容均来自官方网站或者官方手册Feature的Google翻译的加了我的一些调整,没有任何主观成分。 1. FreeRTOS   FreeRTOS是专为小型嵌入式系统设计的可扩展的实时内核。 亮点包括: 微小的封装形式。 免费的RTOS调度程序 免费嵌入式软件源代码。 免版税。 抢占式,协作式和混合配置...