最近因为工作需要用到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这里有我自己移植成功后,自己写的一消息对列的代码,其中驱动部分使用的是原子哥的例子中的代码。

转载于:https://www.cnblogs.com/w-smile/p/9313171.html

freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5相关推荐

  1. 移植好U8g2图形库的STM32F407标准库工程模板,0.96寸OLED驱动程序

    移植好U8g2图形库的STM32F407标准库工程模板,用的0.96寸OLED屏(SSD1306),用硬件IIC驱动. 花了一晚上时间去移植.开发板主控MCU用的是STM32F407VET6,I2C接 ...

  2. 0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32

    ** 0.96寸OLED显示屏标准库移植HAL库,使用模拟IIC ** 由于项目的需要使用OLED屏显示,并且现有的项目程序是基于HAL库编写的,而手头能找到的程序是标准库的驱动程序,大概看了一下代码 ...

  3. 四针脚0.96寸OLED屏幕标准库代码转Cube Max创建的HAL库工程代码

    stm32学了一个多月了. 刚开始是跟着江科大学的,讲的很好,里面是用标准库. 后来因为Hal库用着简单,就开始学习Hal库,跟的是b站的[小蜜蜂笔记]基于STM32CubeMX的嵌入式开发基础教程. ...

  4. leach协议c++代码_入门教程4:教你STM32F407标准库移植机智云代码(控制LED灯)

    我们知道,使用机智云自助开发平台会根据产品定义的数据点生成对应产品的设备端代码即MCU代码包.自动生成的代码实现了机智云通信协议的解析与封包.传感器数据与通信数据的转换逻辑,并封装成了简单的API,且 ...

  5. 基于STM32F407标准库串口DMA+空闲中断

    核心板:STM32F407 实验目的:通过DMA接收串口发来的数据,并且利用串口空闲中断在将这些数据发送至串口助手. 在通常我们使用串口接收数据时,会使能串口接收中断,并在每次接收到数据后会进入中断将 ...

  6. boost标准库开发环境搭建boost标准库环境搭建以及简单案例介绍

    1.下载boost相关的库的安装包 网址:http://www.boost.org/ 其中1.55.0版本的下载地址是:http://sourceforge.net/projects/boost/fi ...

  7. IAR新建stm32工程,完美移植stm32标准库(附源码)

    开发环境:Window 10 64bit 开发工具:IAR Embedded Workbench 硬件:stm32f103c8t6 基于IAR 开发工具,新建立STM32F1系列的最小开发例程,并加入 ...

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

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

  9. linux中libc如何升级,linux系统更新libc ,libstdc++标准库

    开发环境下正常运行的c++程序放到新的环境重新make后报: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by /lib64/ ...

最新文章

  1. Swing如何正确的处理界面中的线程(EDT)
  2. C语言OJ项目参考(2399)求倒数和
  3. 第一讲 ODE几何方法
  4. ElasticSearch启动报错,bootstrap checks failed
  5. 【Linux】14_文件打包及压缩
  6. Android攻城狮SurfaceView
  7. redirect通过url_for传递参数_Excel VBA解读 | 进阶篇(127):Sub过程的参数传递技术...
  8. apache访问快捷方式
  9. 彻底卸载acer软件保护卡_宏碁(Acer)传奇 14英寸 新一代7nm六核处理器 真香机 高性能宏基笔记本电脑(R5-4500U 7纳米 16G 512GSSD )...
  10. VS2005的几款代码皮肤。
  11. sae php 当前路径,SAE上使用自定义环境运行异步任务
  12. 【渝粤教育】国家开放大学2018年秋季 1018t国际公法 参考试题
  13. 利用octave求逆矩阵
  14. matlab程序 直线插补,用Matlab实现直线插补计算程序讲解学习
  15. 第三章 硅谷宠儿 Friendster (二)
  16. 重启iis的命令是什么?三种简单的重启方式
  17. animation动画全解
  18. android 进程通信
  19. Java中正则表达式的基本使用
  20. 万字说透 Decentraland:元宇宙的先行者

热门文章

  1. JS中完美兼容各大浏览器的scrolltop方法
  2. CSS之Multi-columns的列数和列宽
  3. 剑指offer--旋转数组的最小数字
  4. rfid射频前端的主要组成部分有_第4章 RFID的射频前端(simple).ppt
  5. ubuntu 启动图形界面命令_Windows 10 远程连接 Ubuntu 18.04 Server图形界面
  6. 第二次实验报告(漏)
  7. 转:基于TLS1.3的微信安全通信协议mmtls介绍
  8. marquee 移动属性
  9. 归并排序算法(C#实现)
  10. linux qtopia-2.2.0编译,qtopia-2.2.0在linux上的安装(基于mini2440)