FreeRTOS学习-移植FreeRTOS到STM32F29_野火stm32f429+freertos+sd卡fatfs移植例程-程序员宅基地

技术标签: 学习  stm32  FreeRTOS  

1.移植FreeRTOS

1.1 移植前准备

1.1.1基础工程

我们首先需要一个STM32裸机工程,我用的开发板是野火提供的开发板STM32F429开发板,选择的例程由野火提供的例程11-GPIO输出-使用固件库点亮LED灯,后续需要其他模块,可自行添加。
在这里插入图片描述

1.1.2 下载FreeRTOS

关于如何获取FreeRTOS的源码包,我们可以通过官网下载,也可以通过github网站下载,两种方式均可,这里提供官网下载方式,也提供了FreeRTOS源码包 密码。

打开FreeRTOS官网链接,点击下载FreeRTOS
在这里插入图片描述
选择FreeRTOS202212.01 进行下载
在这里插入图片描述
打开FreeRTOS\Source文件,里面的内容就是我们要移植到裸机工程里的FreeRTOS源代码
在这里插入图片描述

1.2 开始移植

1.2.1添加FreeRTOS内核文件

在工程模板下新建一个FreeRTOS文件夹,FreeRTOS文件夹里新建include、portable、src三个文件夹,用来存放相关头文件,portable用于保存内存管理以及处理器架构相关代码,src文件夹用于保存FreeRTOS中的核心源文件
FreeRTOS
| _ _ include
| _ _ portable
| _ _ src

在这里插入图片描述
1.打开FreeRTOS\Source\include文件夹,将里面所有文件拷贝到include文件夹下面
在这里插入图片描述
2.打开FreeRTOS\Source 将里面的.c文件全部拷贝到src文件夹下
在这里插入图片描述
3.这里我们使用的是开发板芯片是STM32F429,内核是Cortex-M4F,打开FreeRTOS\Source\portable
将RVDS文件拷贝到portable文件夹下,或者也可以仅拷贝RVDS里面的ARM_CM4F文件夹
在这里插入图片描述
4.最后我们把包含在FreeRTOS内存分配实现拷贝到工程里,FreeRTOS与其他OS的区别之一就是在与FreeRTOS操作系统在源代码中,系统初始化工程任务创建已经自动分配好内存,不需要人为分配内存。将FreeRTOS\Source\portable中MemMang拷贝到portable文件夹下,
在这里插入图片描述

下面是五种内存分配的区别 :

  • heap_1 – 最简单,不允许释放内存
  • heap_2 – 允许释放内存,但不会合并相邻的空闲块
  • heap_3 – 简单包装了标准malloc()和free(),以保证线程安全
  • heap_4 – 合并相邻的空闲块以避免碎片化。包含绝对地址放置选项
  • heap_5 – 如同heap_4,能够跨越多个不相邻的堆。

注意:

  • heap_1 不太有用,因为 FreeRTOS 添加了静态分配支持。
  • heap_2 现在被视为旧版,因为较新的 heap_4 实现是首选。

1.2.2 添加FreeRTOSConfig.h配置文件到user

  FreeRTOSConfig.h 文件是 FreeRTOS 的工程配置文件,因为 FreeRTOS 是可以裁剪的
实时操作内核,应用于不同的处理器平台,用户可以通过修改这个 FreeRTOS 内核的配置
头文件来裁剪 FreeRTOS 的功能,所以我们把它拷贝一份放在 user 这个文件夹下面。
  打开FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK目录,找到FreeRTOSConfig.h,将其拷贝到工程的user文件夹下面

1.2.3 添加FreeRTOS源码到keil工程组

1.2.3.1 新建 FreeRTOS/src 和 FreeRTOS/port 组

  这里我们用到开发环境是keil,打开keil工程,新建 FreeRTOS/src 和 FreeRTOS/port 两个组文件夹,其中FreeRTOS/src 用于存放 src 文件夹的内容, FreeRTOS/port 用于存放 port\MemMang 文件夹,在 user 分组中添加我们 FreeRTOS 的配置文件FreeRTOSConfig.h至此我们的FreeRTOS 添加到工程中就已经完成,完成的效果具体见下图。
在这里插入图片描述

1.2.3.2 指定 FreeRTOS 头文件的路径

  FreeRTOS 的源码已经添加到开发环境的组文件夹下面,编译的时候需要为这些源文件
指定头文件的路径,不然编译会报错。 FreeRTOS 的源码里面只有 FreeRTOS\include 和
FreeRTOS\port\RVDS\ARM_CM?这两个文件夹下面有头文件,只需要将这两个头文件的
路径在开发环境里面指定即可。同时我们还将 FreeRTOSConfig.h 这个头文件拷贝到了工程
根目录下的 user 文件夹下,所以 user 的路径也要加到开发环境里面。 FreeRTOS 头文件的
路径添加完成后的效果具体见下图
在这里插入图片描述

1.2.3.3 使能硬件浮点支持

这里我们已经将这个FreeRTOS源码,整个工程移植到裸机工程了,编译这个工程会可能会报以下错误,如下图所示
在这里插入图片描述
这是因为我们没有使能硬件浮点,解决方法如下:打开魔术棒,在Floating Point Hardware一栏中从之前的Not Used 切换到Single Precision,点击OK 保存配置。
在这里插入图片描述
再次重新编译,发现还是有错误,提示有SVC_Handler、PendSV_Handler、SysTick_Handler三个中断服务函数多次定义,如下图所示
在这里插入图片描述

1.2.3.4 中断服务函数多次实现

通过全局搜索查找SVC_Handler,我们发现在FreeRTOS源代码中已经实现了SVC_Handler函数,而之前在stm32f4xx_it.c文件中也实现了该函数,我们需要删除掉stm32f4xx_it.c中SVC_Handler中断服务函数的实现,其他两个也是这种情况。
在这里插入图片描述
在这里插入图片描述

1.2.3.4 禁用钩子函数

在stm32f4xx_it.c找到函数实现,并删除掉,再次编译出现一些钩子函数没有定义
在这里插入图片描述
搜索发现这些函数没有定义或者注释掉了,这里我们在FreeRTOSConfig.h把相关设置调成0,不使用钩子函数
在这里插入图片描述

再次编译, 0 Error,0 Warning,移植完毕
在这里插入图片描述

2.验证移植

2.1main.c添加头文件

#include "stm32f4xx.h"
#include "./led/bsp_led.h"
#include "FreeRTOS.h"
#include "task.h"

2.2 实现LED_Task()

void LED_Task()
{
    while(1)
    {
        LED1( ON );	
        vTaskDelay(1000);
        LED1( OFF );	
        vTaskDelay(1000);  
    }
}

2.3 在main函数里创建任务并执行调度器

int main(void)
{
    TaskHandle_t LED_TaskHandle = NULL;
    BaseType_t xReturn = pdPASS;
	/* LED 端口初始化 */
	LED_GPIO_Config();
    
    //create led task
    xReturn = xTaskCreate(  LED_Task,
                            "LED_Task",
                            128,
                            NULL,
                            4,
                            &LED_TaskHandle);
    
    if(xReturn == pdPASS)
    {
        vTaskStartScheduler();
    }
}

2.4下载程序

将程序编译后,无错误提示,把程序下载到开发板,发现LED灯每隔一秒进行闪烁,说明FreeRTOS移植成功,可以正常创建任务并执行。

3.相关文件链接

FreRTOSv202212.01版本:链接:https://pan.baidu.com/s/1s9xnEuGwRhlcnHhaZzOaew 提取码:4xrd
工程源码链接 :https://pan.baidu.com/s/1P3bXQGDlBe1uPIAO9Oxjnw 提取码:frf3

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43525512/article/details/135076539

智能推荐

从零开始搭建Hadoop_创建一个hadoop项目-程序员宅基地

文章浏览阅读331次。第一部分:准备工作1 安装虚拟机2 安装centos73 安装JDK以上三步是准备工作,至此已经完成一台已安装JDK的主机第二部分:准备3台虚拟机以下所有工作最好都在root权限下操作1 克隆上面已经有一台虚拟机了,现在对master进行克隆,克隆出另外2台子机;1.1 进行克隆21.2 下一步1.3 下一步1.4 下一步1.5 根据子机需要,命名和安装路径1.6 ..._创建一个hadoop项目

心脏滴血漏洞HeartBleed CVE-2014-0160深入代码层面的分析_heartbleed代码分析-程序员宅基地

文章浏览阅读1.7k次。心脏滴血漏洞HeartBleed CVE-2014-0160 是由heartbeat功能引入的,本文从深入码层面的分析该漏洞产生的原因_heartbleed代码分析

java读取ofd文档内容_ofd电子文档内容分析工具(分析文档、签章和证书)-程序员宅基地

文章浏览阅读1.4k次。前言ofd是国家文档标准,其对标的文档格式是pdf。ofd文档是容器格式文件,ofd其实就是压缩包。将ofd文件后缀改为.zip,解压后可看到文件包含的内容。ofd文件分析工具下载:点我下载。ofd文件解压后,可以看到如下内容: 对于xml文件,可以用文本工具查看。但是对于印章文件(Seal.esl)、签名文件(SignedValue.dat)就无法查看其内容了。本人开发一款ofd内容查看器,..._signedvalue.dat

基于FPGA的数据采集系统(一)_基于fpga的信息采集-程序员宅基地

文章浏览阅读1.8w次,点赞29次,收藏313次。整体系统设计本设计主要是对ADC和DAC的使用,主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM中,转换开始时读取ROM中数据进行读取转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO中,再从FIFO中读取数据通过串口输出显示在pc上。其整体系统框图如下:图1:FPGA数据采集系统框图从图中可以看出,该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、D.._基于fpga的信息采集

微服务 spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL-程序员宅基地

文章浏览阅读2.5w次。1.背景错误信息:-- [http-nio-9904-exec-5] o.s.c.n.z.filters.post.SendErrorFilter : Error during filteringcom.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud..._com.netflix.zuul.exception.zuulexception

邻接矩阵-建立图-程序员宅基地

文章浏览阅读358次。1.介绍图的相关概念  图是由顶点的有穷非空集和一个描述顶点之间关系-边(或者弧)的集合组成。通常,图中的数据元素被称为顶点,顶点间的关系用边表示,图通常用字母G表示,图的顶点通常用字母V表示,所以图可以定义为:  G=(V,E)其中,V(G)是图中顶点的有穷非空集合,E(G)是V(G)中顶点的边的有穷集合1.1 无向图:图中任意两个顶点构成的边是没有方向的1.2 有向图:图中..._给定一个邻接矩阵未必能够造出一个图

随便推点

MDT2012部署系列之11 WDS安装与配置-程序员宅基地

文章浏览阅读321次。(十二)、WDS服务器安装通过前面的测试我们会发现,每次安装的时候需要加域光盘映像,这是一个比较麻烦的事情,试想一个上万个的公司,你天天带着一个光盘与光驱去给别人装系统,这将是一个多么痛苦的事情啊,有什么方法可以解决这个问题了?答案是肯定的,下面我们就来简单说一下。WDS服务器,它是Windows自带的一个免费的基于系统本身角色的一个功能,它主要提供一种简单、安全的通过网络快速、远程将Window..._doc server2012上通过wds+mdt无人值守部署win11系统.doc

python--xlrd/xlwt/xlutils_xlutils模块可以读xlsx吗-程序员宅基地

文章浏览阅读219次。python–xlrd/xlwt/xlutilsxlrd只能读取,不能改,支持 xlsx和xls 格式xlwt只能改,不能读xlwt只能保存为.xls格式xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改xlrd打开文件import xlrdexcel=xlrd.open_workbook('E:/test.xlsx') 返回值为xlrd.book.Book对象,不能修改获取sheett_xlutils模块可以读xlsx吗

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题_unresolved attribute reference 'find_element_by_id-程序员宅基地

文章浏览阅读8.2w次,点赞267次,收藏656次。运行Selenium出现'WebDriver' object has no attribute 'find_element_by_id'或AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'等定位元素代码错误,是因为selenium更新到了新的版本,以前的一些语法经过改动。..............._unresolved attribute reference 'find_element_by_id' for class 'webdriver

DOM对象转换成jQuery对象转换与子页面获取父页面DOM对象-程序员宅基地

文章浏览阅读198次。一:模态窗口//父页面JSwindow.showModalDialog(ifrmehref, window, 'dialogWidth:550px;dialogHeight:150px;help:no;resizable:no;status:no');//子页面获取父页面DOM对象//window.showModalDialog的DOM对象var v=parentWin..._jquery获取父window下的dom对象

什么是算法?-程序员宅基地

文章浏览阅读1.7w次,点赞15次,收藏129次。算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。 简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵 魂。二、算法的特征1.可行性 算法中执行的任何计算步骤都可以分解为基本可执行的操作步,即每个计算步都可以在有限时间里完成(也称之为有效性) 算法的每一步都要有确切的意义,不能有二义性。例如“增加x的值”,并没有说增加多少,计算机就无法执行明确的运算。 _算法

【网络安全】网络安全的标准和规范_网络安全标准规范-程序员宅基地

文章浏览阅读1.5k次,点赞18次,收藏26次。网络安全的标准和规范是网络安全领域的重要组成部分。它们为网络安全提供了技术依据,规定了网络安全的技术要求和操作方式,帮助我们构建安全的网络环境。下面,我们将详细介绍一些主要的网络安全标准和规范,以及它们在实际操作中的应用。_网络安全标准规范