freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5

  最近因为工作需要用到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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

破解静态WEP KEY全过程

破解静态WEP KEY全过程广州卓讯盟科技有限公司 黄超毅Email:huangchaoyigzpia.com/demonalexdark2s.org发现首先通过NetStumbler确认客户端已在某AP的覆盖区内&#xff0c;并通过AP信号的参数进行‘踩点’&#xff08;数据搜集&#xff09;。NetStumbler 下载地址 http://www.n…

apicloud项目怎么运行_Spring Boot教程(3) – 运行第一个项目

把项目运行起来是极具成就感的事情&#xff0c;不管是在学习新语言还是新框架的过程中。上一篇文章说明了如何使用Spring Initializr和IDE来创建项目&#xff0c;下面就看看项目能不能跑起来&#xff0c;我们通过IDE和命令行&#xff0c;直观地理解框架的作用。先来一张Intelli…

Matlab从入门到精通 Chapter5 数据可视化

5-1 图形绘制示例 >> x2-17:0.02:3;>> y21./((x23).^21)1./((x29).^24)5; >> subplot(2,2,2);>> plot(x2,y2,rp);>> axis([-17 3 5 6.5]);>> title(figure2);>> grid on subplot 子图表绘制函数 默认情况下&#xff0c;plot函数将绘…

破解WEP密钥过程全解 (下)

三、实战破解过程1、用Kismet进行网络探测Kismet是一个基于Linux的无线网络扫描程序&#xff0c;这是一个相当方便的工具&#xff0c;通过测量周围的无线信号来找到目标WLAN。虽说Kismet也可以捕获网络上的数据通信&#xff0c;但在还有其他更好的工具使用(如Airodump)&#xf…

mpAndroidchart 坐标和图表距离_【玩转图表系列】六步,美化你的图表,让老板刮目相看!...

近期隆重推出图表分析系列&#xff0c;包括销售分析、盈亏分析、费用分析、趋势分析、进度分析等&#xff0c;通过双坐标图、甘特图、瀑布图、双层饼图等系列图表精美展现&#xff0c;专业高效&#xff0c;让你从初级学到高级、从小白跨越专业。今天开启我们邦邦财玩转图表第一…

SpringBoot+FreeMarker开发word文档下载,预览

背景&#xff1a; 开发一个根据模版&#xff0c;自动填充用户数据并下载word文档的功能 使用freemarker进行定义模版&#xff0c;然后把数据进行填充。 maven依赖&#xff1a; <parent> <groupId>org.springframework.boot</groupId> <artifactId>…

使用 IPsec 与组策略隔离服务器和域-第 7 章 IPsec 疑难解答

本章提供有关如何对 Internet 协议安全性 (IPsec) 问题&#xff08;如服务器和域隔离方案中的安全性问题&#xff09;进行疑难解答的信息&#xff0c;这些信息依赖于 Microsoft 信息技术 (IT) 小组的经验和方法。 在有可能的时候&#xff0c;本章将引用现有的 Microsoft 疑难解…

单片机的单个IO口可以发送数据吗_关于51单片机各个引脚它的功能你了解多少?...

对于40引脚双列直插51单片机各个引脚功能情况分析。P0端口一默认是开漏准双向IO口&#xff0c;没有输出没有驱动能力&#xff0c;要做逻辑输出要在外部接上拉电阻。P0端口除了作为普通的输入输出功能&#xff0c;还可以用来当做数据总线接口或者地址总线&#xff0c;当外面扩展…

git merge用法_常用命令之git操作(进阶篇)

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作。有人把 Git 的分支模型称为必杀技特性&#xff0c;而正是因为它&#xff0c;将 Git 从版本控制系统家族里区分出来。不同的分支可以理解为…

2G内存刚刚好 浅谈4G内存对笔记本的影响

随着Intel P3x系列芯片组的发布&#xff0c;DDR3内存的普及日益临近&#xff0c;AMD K10系列处理器AM2规格也正式支持DDR3内存&#xff0c;明年即将面临淘汰的DDRII内存是越来越便宜了。很多笔记本用户在购买笔记本的时候都把是否支持4G内存作为一个总要的衡量标准。官方资料里…

由object元素引出的事件注册问题和层级显示问题

项目有一个双击监控视频全屏的需求&#xff0c;视频播放使用的是IE下的ActiveX控件&#xff0c;web页面中使用HTML嵌入对象元素object。预期方案如下&#xff1a; 1.在开发ActiveX控件时加入双击事件。 2.通过div包裹object&#xff0c;控制div的大小从而间接实现全屏效果。 在…

cad钣金展开插件_钣金高级工考试大小头手工展开图步骤教程

提醒&#xff1a;点上方↑↑↑“钣金学习网”免费关注简单方法一: 等分弧画法简单方法二: 角度计算画法1、先画一条中心直线&#xff0c;在线上取一点A&#xff0c;过&#xff21;点画一条与中心线垂直相交线。量取大头半径以&#xff21;点为起点在相交线上标注一点&#…

介绍一个新鲜玩意 开源的杀毒软件

有“免费的午餐”我们为什么不吃呢&#xff1f;杀毒软件一定要购买或用D版吗&#xff1f;先别忙着下结论&#xff0c;请耐心看完本文&#xff0c;然后再告诉我你是怎么想的。&#xff08;一&#xff09;、ClamWin Free Antivirus 开源反病毒软件 GPL协议SourceForge页面&#x…

没有可用软件包 jenkins。_Jenkins分布式构建与并行构建

Jenkins分布式构建与并行构建 jenkins的架构 Jenkins采用的是“masteragent&#xff08;slave&#xff09;”架构。Jenkins master负责提供界面、处理HTTP请求及管理构建环境&#xff1b;构建的执行则由Jenkins agent负责 Jenkins agent的横向扩容&#xff1a;只需要增加agent就…

qstring去掉特定字符_如何花式、批量且操作简单地处理字符?

文本字符的规范化&#xff0c;是批量处理的前提。多来源数据或是数据收集本身就必然存在不规范情况&#xff0c;于是批量地完成它就成了常见的需求。对于花式批量处理&#xff0c;自然要说到正则表达式。“正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好…

性能度量RMSE

回归问题的典型性能度量是均方根误差&#xff08;RMSE:Root Mean Square Error&#xff09;。如下公式。 m为是你计算RMSE的数据集中instance的数量。x(i)是第i个实例的特征值向量 ,y(i)是其label&#xff08;期望的模型输出&#xff09;。如下&#xff1a;X是包含了所有实例的…

【数学建模】day02-整数规划

基本类似于中学讲的整数规划--线性规划中变量约束为整数的情形。 目前通用的解法适合整数线性规划。不管是完全整数规划(变量全部约束为整数)&#xff0c;还是混合整数规划(变量既有整数又有实数)&#xff0c;MATLAB都提供了通用的求解函数。 一、0-1型整数规划 这类规划将变量…

VMware的linux虚拟机实现和windows的文件共享

使用的centos7和windows10&#xff0c;在虚拟机centos7中是root身份。由于是第一次用没有界面的linux&#xff0c;可谓是困难重重…… 一 打开VMware&#xff0c;然后选中你的虚拟机&#xff0c;我的是centos7。然后点击工具栏”虚拟机“&#xff0c;然后选择”安装VMware tool…

javascript进制转换_「js基础」JavaScript逻辑和位运算符归纳

上一篇文章呢&#xff0c;我们讲述了JavaScript运算符中的关系运算符和逻辑运算符&#xff0c;那么紧接上一篇的文章我们今天来说说逻辑运算符。引言逻辑运算符不是很难&#xff0c;也不是很多&#xff0c;我们只要记住三个就可以啦&#xff01;分别是&#xff1a;&#xff01;…

〖强暴贴〗号称全国最大开发者网络的CSDN多次出现低级错误 验证码形同虚设 开发人员竟是MVP

分享一下我老师大神的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;还带黄段子&#xff01;希望你也加入到我们人工智能的队伍中来&#xff01;https://blog.csdn.net/jiangjunshow主  题&#xff1a;【醒目】〖强暴贴〗号称全国最大开发者网络…