FreeRTOS应用开发笔记之一:FreeRTOS在STM32的移植

FreeRTOS是如今在小型嵌入式领域应用比较广泛的一种实时操作系统。它是一种开源且免费的操作系统,而且移植和使用都非常的简单。在这里我们将学习并移植FreeRTOS。

1、必要的准备

工欲善其事,必先利其器,在开始学习和移植之前,相应的准备工作必不可少。所以在开始我们需要有必要的准备:

  • 下载FreeRTOS源码,可以从官网下载源码,最新版本为V10.0.1,官网地址:https://www.freertos.org/a00104.html
  • 下载学习资料,FreeRTOS官方提供入门手册和参考手册,可以在线查看,也可以下载pdf版本的电子书。下载网址:https://www.freertos.org/Documentation/RTOS_book.html
  • 准备实验平台,此次我们将在STM32F407平台上移植和测试FreeRTOS系统

下载的FreeRTOS源码是一个自解压的文件,解压后包含的内容比较丰富,不过目录结构很清晰,主要包含两个子目录:FreeRTOS和FreeRTOS-Plus。如下所示:

  • FreeRTOS-Plus       包含FreeRTOS+组件和演示例程;
  • FreeRTOS                包含FreeRTOS实时内核源文件和演示例程。

我们学习的FreeRTOS内核部分在FreeRTOS目录之下,打开FreeRTOS文件夹它又被分成两个主要的子目录,如下所示:

  • Demo         包含演示例程工程;
  • License      包含授权文件
  • Source       包含实时内核源文件。

RTOS代码的核心包含在三个文件中:tasks.c、queue.c、list.c。这三个文件位于FreeRTOS/Source目录。在该目录下还包含三个可选的文件:timers.c、event_groups.c、croutine.c,分别实现软件定时、事件组和协程功能。打开Source文件夹,FreeRTOS/Source目录结构如下所示:

应用平台的不同,所以每个支持的处理器架构都有一段与处理器架构相关的RTOS代码。这个是RTOS移植层,它位于FreeRTOS/Source/Portable/[相应编译器]/[相应CPU架构]子目录。

对于FreeRTOS,堆栈设计也属于移植层。FreeRTOS/Source/portable/MemMang目录下heap_x.c文件给出了多种堆栈方案,在后续的移植中,会详细说明。

2、简单的移植

前面我们简要说明了移植的准备工作,接下来我们开始最主要的移植。本次移植我们将在IAR平台上进行,首先要创建一个IAR项目。我们在IAR下创建一个名为pfreertos的项目,并添加Application、Drivers和Middlewares几个组。并在Application下添加EWARM和User组;在Drivers下添加CMSIS和STM32F4xx_HAL_Driver组;在Middlewares下添加FreeRTOS组,具体如下:

至于具体文件的物理路径并没有特别要求,但为了便于管理,我们强烈建议放到一起。并将相关的FreeRTOS源码拷贝到该项目目录下。

将\FreeRTOSv10.0.1\FreeRTOS\Source目录下的源文件及include文件夹复制到新建项目的文件夹中。

将\FreeRTOSv10.0.1\FreeRTOS\Source\portable\IAR\ARM_CM4F目录下的三个文件也复制到新建项目的文件夹。

将\FreeRTOSv10.0.1\FreeRTOS\Source\portable\MemMang目录下的heap_4.c文件复制到新建项目的文件夹。

将\FreeRTOSv10.0.1\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK目录下的FreeRTOSConfig.h文件复制到新建项目的文件夹。

同时将这下文件添加到我们前面创建的pfreertos项目中,其它如ST驱动及用户应用也添加到项目中。并将相关的引用目录添加到项目属性中。需要说一下的是在Assembler中的Preprocessor标签下添加也需要添加FreeRTOSConfig.h的引用路径,因为在汇编文件中有对FreeRTOSConfig.h文件的引用。

FreeRTOSConfig.h 配置文件中,有如下3个宏定义:

#define vPortSVCHandler          SVC_Handler

#define xPortPendSVHandler     PendSV_Handler

#define xPortSysTickHandler     SysTick_Handler

需要在stm32f4xx_it.c文件中,将对应的三个空的函数定义注释掉。至此,其实编译就已不会有错,移植工作已经完成。当然在有些其他的基础库也需要使用SysTick时,我们也可以在中断中调用xPortSysTickHandler()函数来实现我们的需求。

3、移植测试

前面我们已经移植了FreeRTOS,接下来我们创建多个任务测试一下它。

在main.c文件中添加相应的代码,声明如下函数及代码(我计划4个任务):

/***************************************************************************
函数声明
***************************************************************************/
static void vTask1(void *pvParameters);
static void vTask2(void *pvParameters);
static void vTask3(void *pvParameters);
static void vTask4(void *pvParameters);
static void AppTaskCreate (void);/***************************************************************************
变量声明
***************************************************************************/
static TaskHandle_t xHandleTask1 = NULL;
static TaskHandle_t xHandleTask2 = NULL;
static TaskHandle_t xHandleTask3 = NULL;
static TaskHandle_t xHandleTask4 = NULL;

任务创建函数如下:

static void AppTaskCreate (void)
{xTaskCreate( vTask1, "vTask1",512, NULL,1, &xHandleTask1);xTaskCreate( vTask2, "vTask2",512, NULL,1, &xHandleTask2);xTaskCreate( vTask3, "vTask3",512, NULL,1, &xHandleTask3);xTaskCreate( vTask4, "vTask4",512, NULL,1, &xHandleTask4);
}

主函数如下:

int main(void)
{/* 创建任务 */AppTaskCreate();/* 启动任务调度,开始执行任务 */vTaskStartScheduler();
}

编译无错误4个任务同时运行。移植初步测试成功。

4、几点说明

在FreeRTOS中定义了多种内存管理方式,对应的文件有5个,那么每个文件实现了什么?怎么选用呢?我们对于内存管理的几个文件的大致内容描述如下:

  • heap_1.c:这是所有实现中最简单的一个。一旦分配内存之后,它甚至不允许释放分配的内存。
  • heap_2.c:和heap_1不同,这个方案使用一个最佳匹配算法,它允许释放之前分配的内存块。它不会把相邻的空闲块合成一个更大的块,可能会造成内存碎片。
  • heap_3.c:简单的包装了标准库中的malloc()和free()函数,包装后的malloc()和free()函数具备线程保护。
  • heap_4.c:这个方案使用一个最佳匹配算法,但不像方案2那样。它会将相邻的空闲内存块合并成一个更大的块。
  • heap_5.c:这个方案同样实现了heap_4.c中的合并算法,并且允许堆栈跨越多个非连续的内存区。

在前面说过FreeRTOSConfig.h 配置文件中,有如下3个宏定义。该宏定义避免了修改启动文件,但有一个地方需要注意一下。就是第3个宏定义“#define xPortSysTickHandler       SysTick_Handler”。如果采用的是ST的标准库没有问题,但如果采用的是HAL库,由于HAL库需要SysTick中断才能稳定运行,所以不能采用宏定义,而是在stm32f4xx_it.c文件中的SysTick中断响应函数中调用xPortSysTickHandler函数。

欢迎关注:

 

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

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

相关文章

外设驱动库开发笔记13:MLX90614红外温度传感器驱动

红外温度传感器一般用于非接触式的温度检测。在我们的系统中经常会有这样的需求。所以我们将其设计为通用的驱动库以备复用。这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现。 1、功能概述 MLX90614是一种红外温度计,用于非接触式温度测量。红外测温是根…

Modbus协议栈应用实例之三:Modbus TCP客户端应用

自从开源了我们自己开发的Modbus协议栈之后,有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例,这一篇中我们将解说如何使用协议栈实现一个Modbus TCP客户端。 1、何为TCP客户端 Modbus…

Modbus协议栈应用实例之四:ModbusTCP服务器应用

自从开源了我们自己开发的Modbus协议栈之后,有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例,这一篇中我们来简述如何使用协议栈实现一个Modbus TCP服务器应用。 1、何为TCP服务器 Mo…

外设驱动库开发笔记14:DS18B20温度变送器驱动

在一时候我们需要相对简单的检测温度信号,而DS18B20就是一款功能和应用都相对简单的温度传感器,通过单线就可以实现检测温度信号的需求。这一篇我们就来实现操作DS18B20获取温度数据的驱动。 1、功能概述 DS18B20是常用的数字温度传感器,其…

Modbus协议栈应用实例之五:Modbus ASCII主站应用

自从开源了我们自己开发的Modbus协议栈之后,有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例,这一篇中我们来使用协议栈实现Modbus ASCII主站应用。 1、何为ASCII主站 我们知道Modbus…

Modbus协议栈应用实例之六:Modbus ASCII从站应用

自从开源了我们自己开发的Modbus协议栈之后,有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例,这一篇中我们来使用协议栈实现Modbus ASCII从站应用。 1、何为ASCII从站 我们知道Modbus…

外设驱动库开发笔记15:DHT11温湿度传感器驱动

与DS18B20一样DHT11也是采用单总线,但所不同的是DHT11可同时实现温度和湿度的检测。在我们的产品中经常使用它来检测环境的温湿度信息。这一篇我们将设计并封装DHT11的驱动程序,以方便重复使用。 1、功能概述 DHT11数字温湿度传感器是一款含有已校准数…

外设驱动库开发笔记16:MS5536C压力变送器驱动

压力检测也是经常会遇到的需求,比如环境压力或者低压气体等都会用到压力检测。这类检测压力都比较低,一般不会超过大气压,有时甚至是负压。这一篇我们要讨论的MS5536C就属于这类器件。接下来我们将设计并实现MS5536C的驱动。 1、功能概述 M…

外设驱动库开发笔记17:MS5803压力变送器驱动

很多时候我们需要检测被控对象的绝对压力,而且在我们的多款产品中也有这样的需求。当然检测绝对压力的传感器有很多,我们经常使用MS5803来实现压力检测。本篇中我们将设计并实现MS5803系列压力传感器的驱动。 1、功能概述 MS5803系列产品包含压阻传感器…

通讯接口应用笔记1:RS485通讯上下拉电阻的选择

RS485是一种常见的通讯接口方式,在我们的实际产品中也是多次使用。但我们平常并不会去过多考虑某一实现的细节问题,不过最近我们遇到了一个因如上下拉电阻的选择问题而造成的通讯故障,所以在这一片中我们来讨论一下RS485总线上下拉电阻的选择…

外设驱动库开发笔记18:MS5837压力变送器驱动

绝对压力的检测是常见的需求。在我们的系统中也常常会遇到。而MS5837压力传感器也是我们进场会采用的方案。在这篇里我们将讨论并实现MS5837压力传感器的驱动。 1、功能概述 MS5837压力传感器是一种可用于电路板上,适用于检测10-1200mbar压力范围的传感器&#xf…

外设驱动库开发笔记19:BMP280压力温度传感器驱动

压力和温度监测在嵌入式系统开发中是非常常见的需求,特别是对环境大气压力和温度的检测需求就更常见了。我们一般都会选择一些封装较小操作比较方便的压力传感器。BMP280就是满足这一要求的器件。在这一篇中我们将设计并实现BMP280的驱动。 1、功能概述 BMP280是一…

一个简单的空气质量数据监测站项目

大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测。并通过网络将数据上传到OneNet​显示。​ 1、项目概述 本项目是一个定制项目,要求采集大气的压力、温度、湿度、PM25、位置等数据并上传到指定的后台服务器。但有时…

一个基于STM32实现的多组分气体分析仪项目

本篇将简要的总结一下一个基于STM32F412ZG实现的多组分气体分析仪的项目。简要描述该项目的软硬件设计及其验证。 一、项目概述 多组分气体分析仪是我公司近期研发的三个主要产品之一。采用模块化设计,可增减配置,可分析混合气体中的氧气、氢气、甲烷、…

外设驱动库开发笔记20:BME280压力湿度温度传感器驱动

嵌入式产品开发中,我们常常会有检测环境温度、压力、湿度的需求。如果有一个集成有这3个传感器的元件,无疑将是很方便的。博世的BME280就能实现这一要求。在这一篇中我们将讨论BME280的驱动设计与实现。 1、功能概述 BME280是一款专为移动应用而开发的…

外设驱动库开发笔记21:BME680环境传感器驱动

环境传感器是一类我们很常用的传感器。它可以方便我们获取压力、温度、湿度以及空气质量等数据。在这一篇中,我们将分析BME680环境传感器的功能,并设计和实现BME680环境传感器的驱动。 1、功能概述 BME680是一款专为移动应用和可穿戴设备开发的集成环境…

外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

移动设备的广泛应用增加对移动过程中各种参数的检测需求。ADXL345三轴数字加速度计可以用来检测加速度、进而测量倾斜角度等。在这一篇中,我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现。 1、功能概述 ADXL345是一款小而薄的超低功耗3轴加速度计&#x…

外设驱动库开发笔记23:AT24Cxx外部存储器驱动

在我们的应用开发过程中,经常会使用到外部的EEPROM外部存储器来保存一些参数和配置数据等。而比较常用的就是AT24Cxx系列产品,这一节我们来开发用于操作AT24Cxx系列产品的驱动。 1、功能概述 AT24Cxx系列EEPROM包括从1Kbit到2Mbit的各种容量。AT24Cxx系…

外设驱动库开发笔记24:FM24xxx系列FRAM存储器驱动

虽然说使用EEPROM保存参数很有效,但操作及使用次数均有一下限制。当我们的一些参数需要不定时修改或存储时,使用FRAM就更为方便一点。这一节我们就来设计并实现FM24xxx系列FRAM的驱动。 1、功能概述 我们首先说一下铁电随机存取存储器,F-RA…

外设驱动库开发笔记25:FM25xxx FRAM存储器驱动

在我们的项目中,时常会有参数或数据需要保存。铁电存储器的优良性能和操作方便常常被我们选用。FM25xxx FRAM存储器就是我们经常使用到的一系列铁电存储器,这一篇我们将讨论FM25xxx FRAM存储器的驱动设计、实现及使用。 1、功能概述 FM25xxx FRAM存储器…