最近因为工作需要用到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的标准工程,然后解压后的文件我们只用留下Source\portable如下的代码因为我移植的工程是keil5的所以留下keil,但是这个文件夹其实没什么用(对于我下载到的版本)。其中RVDS文件夹下也只留下的目标板相关的ARM_CM4F  因为FreeRTOS这个版本已经支持F4的FPU

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

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

打开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...
..\OBJ\Template.axf: Error: L6200E: Symbol SVC_Handler multiply defined (by port.o and stm32f4xx_it.o).
..\OBJ\Template.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by port.o and stm32f4xx_it.o).
..\OBJ\Template.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.
"..\OBJ\Template.axf" - 3 Error(s), 0 Warning(s).
Target not created

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

linking...
..\OBJ\Template.axf: Error: L6218E: Undefined symbol pvPortMalloc (referred from event_groups.o).
..\OBJ\Template.axf: Error: L6218E: Undefined symbol vPortFree (referred from event_groups.o).
..\OBJ\Template.axf: Error: L6218E: Undefined symbol vApplicationIdleHook (referred from tasks.o).
..\OBJ\Template.axf: Error: L6218E: Undefined symbol vApplicationStackOverflowHook (referred from tasks.o).
..\OBJ\Template.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.
"..\OBJ\Template.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...
..\OBJ\Template.axf: Error: L6218E: Undefined symbol pvPortMalloc (referred from event_groups.o).
..\OBJ\Template.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.
"..\OBJ\Template.axf" - 2 Error(s), 0 Warning(s).
Target not created

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

在这里我们选择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...
"..\OBJ\Template.axf" - 0 Error(s), 0 Warning(s).

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

freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5的更多相关文章

  1. 在Amazon FreeRTOS V10中使用运行时统计信息

    在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考 ...

  2. C++标准库(体系结构与内核分析)(侯捷第二讲)

    一.OOP和GP的区别(video7) OOP:面向对象编程(Object-Oriented programming) GP:泛化编程(Generic programming) 对于OOP来说,我们要 ...

  3. 【RTOS】基于V7开发板的最新版FreeRTOS V10.2.0程序模板,含MDK和IAR,支持串口打印任务执行情况

    模板下载: 链接:https://pan.baidu.com/s/1N32Hx7cTbDoRinuzTUB3zw   提取码:6aox 1.MDK使用MDK5.26及其以上版本. 2.IAR使用IAR ...

  4. LEDAPS1.3.0版本移植到windows平台----HuCal定标模块

    这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. HuCal是将LEDAPS项目中的TM/E ...

  5. cocos2dx-3.0(21) 移植android平台 说多了都是泪

    ----我的生活,我的点点滴滴! ! 网上3.0的教程真心少.能够说没有吧,大多都是2.x 或者 3.0測试版之类的,因为我心大,没有照着2.x去搞,后来搞完后总结了一下,发觉事实上3.0的移植and ...

  6. [C/C++标准库]_[0基础]_[交集和补集]

    场景: 1. 计算std::vector A和 std::vector B里的同样的元素, 用于保留不删除. 2. 计算std::vector A和 std::vector B里各自的补集, 用于删除 ...

  7. 四轴飞行器1.2.3 STM32F407时钟配置和升级标准库文件

    原创文章,欢迎转载,转载请注明出处 这个星期进度比较慢哈,只有周末和晚上下班回来才能做,事件不连续,琐碎的事情又比较多,挺烦的,有多琐碎呢?           1.本人有点小强迫症哈,虽然RTT将文 ...

  8. VMware Workstation(虚拟机软件) V10.0 简体中文版可以安装了

    在虚拟机软件中VMware Workstation算是一款非常强大较稳定的软件了,今天 VMware Workstation 10.0正式发布了,最让人欣喜的是该版本终于有了简体中 文版了,从现在开始 ...

  9. 从0开始的Python学习017Python标准库

    简介 Python标准库使随着Python附带安装的,它包含很多有用的模块.所以对一个Python开发者来说,熟悉Python标准库是十分重要的.通过这些库中的模块,可以解决你的大部分问题. sys模 ...

随机推荐

  1. 上海某小公司面试题:synchronized锁原理

    synchronized锁是Java面试的过程中比较常考的知识点了,从偏向锁->轻量级锁->重量级锁都可以聊 CAS在这篇没有讲述,因为在上一篇已经写了,有兴趣的同学可以翻翻开 目前已经连 ...

  2. Markdown 编辑器+同步预览+文件笔记管理+静态博客 metadata 管理

    Leanote: 1. 笔记管理, 支持富文本, markdown, 写作模式.... 编辑器绝对好用. 另外特意为coder制作了一个贴代码的插件, 真是太贴心(因为作者也是coder) 2. 博客 ...

  3. [从源码学设计] Flume 之 memory channel

    [从源码学设计] Flume 之 memory channel 目录 [从源码学设计] Flume 之 memory channel 0x00 摘要 0x01 业务范畴 1.1 用途和特点 1.2 C ...

  4. 为什么 Go 模块在下游服务抖动恢复后,CPU 占用无法恢复

    为什么 Go 模块在下游服务抖动恢复后,CPU 占用无法恢复 https://xargin.com/cpu-idle-cannot-recover-after-peak-load/ 极端情况下收缩 G ...

  5. Webpack4.0各个击破(10)integration篇

    一. Integration 下文摘自webpack中文网: 首先我们要消除一个常见的误解,webpack是一个模块打包工具(module bundler),它不是一个任务执行工具,任务执行器是用来自 ...

  6. Java中的transient关键字,使用小结

    transient关键字的介绍: 一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,可以不必关系具体序列化的过程,只要这个类实现了S ...

  7. java 对象之间的复制

    package com.jy.demo.web; import java.util.Date; public class People { private String name;//姓名 priva ...

  8. 使用mybatis自动实现接口封装返回结果集

    import java.lang.annotation.Annotation; import java.lang.annotation.Documented; import java.lang.ann ...

  9. 关于Java注解(annotation)的简单理解

    一.什么是注解? 从 JDK5 开始,Java增加对元数据的支持,也就是注解.简单理解就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部 ...

  10. 为什么对gRPC做负载均衡会很棘手?

    在过去的几年中,随着微服务的增长,gRPC在这些较小的服务之间的相互通信中获得了很大的普及,在后台,gRPC使用http/2在同一连接和双工流中复用许多请求. 使用具有结构化数据的快速,轻便的二进制协 ...