极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第8章 FreeRTOS基础_第1页
极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第8章 FreeRTOS基础_第2页
极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第8章 FreeRTOS基础_第3页
极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第8章 FreeRTOS基础_第4页
极简STM32:基于HAL库与FreeRTOS的Arm Cortex-M4编程与开发 课件 第8章 FreeRTOS基础_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章FreeRTOS基础第8章FreeRTOS基础【实践案例8-1】基于FreeRTOS工程的创建【照猫画虎8-1】基于FreeRTOS工程的创建【实践案例8-2】软件定时器的使用【照猫画虎8-2】软件定时器的使用

8.1.1嵌入式操作系统8.1.2FreeRTOS的功能和特性

8.1.3固件包中的FreeRTOS8.1FreeRTOS简介8.1.1嵌入式操作系统从计算机用户的角度来说,计算机操作系统(Operating-System,OS)体现为提供的各项服务和管理功能;从程序员的角度来说,操作系统主要是指用户登录的界面或者接口;从设计人员的角度来说,操作系统指的是各种程序模块和单元及其相互之间的联系。8.1FreeRTOS简介操作系统的基本功能进程管理存储管理设备管理文件管理作业管理

嵌入式操作系统(EmbeddedOperating-System,EOS)是指用于嵌入式系统的操作系统,是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统负责嵌入式系统的全部硬件和软件资源的分配和任务调度,控制和协调各种并发活动。8.1FreeRTOS简介嵌入式操作系统特

点:系统内核小专用性强系统精简高实时性对于一般的嵌入式系统,如果功能要求相对比较简单,通过精心的程序设计,采用不带操作系统支持的裸机系统也能很好地实现其功能。但是,如果系统功能比较复杂,需要分解为很多子任务才能实现,或者为了保证系统的实时性等要求,这种情况下就必须使用实时操作系统(RTOS,Real-TimeOperating-System)。在编程和系统运行过程中,借助操作系统的支持,可以将复杂的功能分解为多个任务,便于实现系统功能的模块化设计,使得程序结构简单,易于维护和扩展,能够有效地提高开发效率。8.1FreeRTOS简介多任务实时操作系统实时系统又分为两类,即硬实时系统和软实时系统。实时嵌入系统是为执行特定功能而设计的,可以严格的按时序执行功能,其最大的特征就是程序的执行具有确定性。在实时系统中,如果系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,则称为硬实时系统。而在软实时系统中,虽然响应时间同样重要,但是超时却不会导致致命错误。一个硬实时系统往往在硬件上需要添加专门用于时间和优先级管理的控制芯片,而软实时系统则主要在软件方面通过编程实现时限的管理。8.1FreeRTOS简介8.1.2FreeRTOS的功能和特性FreeRTOS是迷你型的多任务实时操作系统,已经作为一个中间件集成到STM32固件包中,在CubeIDE和固件包的安装过程中将自动安装。FreeRTOS的功能包括任务管理、时间管理、信号量、消息队列、内存管理、资源管理、软件定时器、中断管理、事件组和任务通知等,可基本满足较小系统的需要。FreeRTOS支持基于任务优先级的抢占式任务调度算法,能满足硬实时系统的要求,能够可以将复杂的系统功能分解为若干小的任务,便于实现程序功能的模块化,便于简化系统结构、便于系统功能扩展和运行维护。8.1FreeRTOS简介FreeRTOS具有如下特性和功能:

(1)抢占式(Pre-emptive)或合作式(Co-operative)任务调度方式

(2)灵活的优先级管理

(3)提供了队列(Queues)、二值(Binary)和计数(Counting)信号量(Semaphore)、互斥量(Mutexes)和递归互斥量(RecursiveMutexes)以及事件组(EventGroups)等功能组件以及灵活、快速而轻量化的任务通知(TaskNotification)机制

(4)提供了软件定时器(SoftwareTimers)

(5)运行任务统计收集(TaskRun-TimeStaticsGathering)

(6)用于超低功耗的无节拍(Tick-less)特性

(7)全中断嵌套模型(Fullinterruptnestingmodel)

(8)可选的商业许可和支持(Optionalcommerciallicensingandsupport)。8.1FreeRTOS简介8.1.3固件包中的FreeRTOS8.1FreeRTOS简介CMSIS标准接口文件,提供了FreeRTOS与固件包的接口,也就是为固件包增加了支持FreeRTOS的功能。FreeRTOS核心文件8.2FreeRTOS的初始化配置8.2.1CubeMX工程配置8.2.2工程文件的基本结构8.2.3主程序文件【实践案例8-1】基于FreeRTOS工程的创建【照猫画虎8-1】基于FreeRTOS工程的创建8.2.1CubeMX工程配置8.2FreeRTOS的初始化配置8.2FreeRTOS的初始化配置8.2FreeRTOS的初始化配置在基于FreeRTOS的应用程序中,系统滴答定时器SysTick将被用作FreeRTOS的基础时钟,所以需要另外设置一个定时器作为HAL库的基础时钟。为此,在CubeMX主页窗口左侧单击SYS,在模式配置窗口的TimebaseSource下拉列表中选择除SysTick以外的其他定时器作为HAL时基源,例如选择定时器TIM7。在FreeRTOS配置面板的AdvancedSettings(高级设置)选项卡中配置使能USE_NEWLIB_REENTRANT选项,以便提高内存使用效率。注

意8.2FreeRTOS的初始化配置8.2.2工程文件的基本结构存放工程所需的FreeRTOS内核源码文件用户配置和程序文件8.2FreeRTOS的初始化配置用户配置和程序文件FreeRTOSConfig.h该文件在Core/Inc文件夹中,用于对FreeRTOS进行各种配置,FreeRTOS的功能裁剪通过该文件中各种宏定义参数的设置实现。freertos.c实现FreeRTOS初始化、创建用户任务并实现用户任务函数。stm32f4xx_hal_timebase_tim.c对配置的HAL库基础时钟定时器进行初始化。8.2FreeRTOS的初始化配置FreeRTOS通用文件FreeRTOS通用功能文件包含FreeRTOS所需的部分缺省宏定义、数据类型定义、接口函数定义等,以便根据CubeMX中的初始化配置实现FreeRTOS的功能裁剪。提供了FreeRTOS中的一些通用定义,如错误编号宏定义,逻辑值的宏定义等,常用的几个宏定义如下:#definepdFALSE ((BaseType_t)0)#definepdTRUE ((BaseType_t)1)#definepdPASS (pdTRUE)#definepdFAIL (pdFALSE)8.2FreeRTOS的初始化配置8.2FreeRTOS的初始化配置CMSIS-RTOS标准接口文件CMSIS-RTOS是在CMSIS接口标准中提供的与FreeRTOS的通用接口,应用程序和中间件组件可以使用该接口中的API,以便在各种软件生态系统中更好地实现代码重用和集成。在具体实现上,这些函数再调用移植得到的RTOS通用功能函数实现具体功能,称为CMSIS-RTOS接口函数。在FreeRTOS中,有V1和V2两个版本的CMSIS-RTOS接口,其中V1版本使得软件能够在不同的实时操作系统下运行(屏蔽了不同RTOS提供的API的差别),而V2版本能够兼容更多的CPU架构和实时操作系统,但编译的代码更大。8.2FreeRTOS的初始化配置如果在模式面板中选择CMSIS_V2,则表示配置使用CMSIS_V2版本接口。在基于CubeMX生成的工程代码中,将生成Middlewares/ThirdParty/FreeRTOS/Source/CMSIS_RTOS_V2目录。在该目录下的文件主要是cmsis_os2.h/.c,其中提供了各种宏常量和宏函数、数据类型、CMSIS接口函数的定义,这些数据类型和函数名称的前缀都是“os”。8.2FreeRTOS的初始化配置硬件相关移植文件硬件相关的移植文件就是需要根据硬件类型进行改写的文件,这些文件在Middlewares/ThirdParty/FreeRTOS/Source/portable目录下,具体又分为架构与编译器、内存管理两类文件。

处理器架构和编译器相关文件这类文件位于/portable/GCC/ARM_CM4F文件夹中,其中主要是portmacro.h和port.c文件。这两个文件中是一些基础数据类型、宏定义和函数定义,这些数据类型和函数的功能实现涉及底层操作,其实现代码甚至是用汇编语言写的,所以与硬件密切相关。8.2FreeRTOS的初始化配置

内存管理相关文件内存管理涉及内存动态分配和释放等操作,与具体的处理器密切相关。FreeRTOS提供了5种内存管理方案,即heap_1至heap_5,在CubeMX中的默认配置为heap_4,则在工程代码中的Middlewares/ThirdParty/FreeRTOS/Source/portable/memMang文件夹中将提供内存管理文件heap_4.c。8.2FreeRTOS的初始化配置8.2.3主程序文件#include"main.h"#include"cmsis_os.h"#include"gpio.h"intmain(void){

HAL_Init();

/*HAL库初始化*/

MX_GPIO_Init();

/*GPIO外设初始化*/

osKernelInitialize();

/*启动FreeRTOS内核组件*/

MX_FREERTOS_Init();

/*FreeRTOS初始化*/

osKernelStart();

/*启动FreeRTOS任务调度器*/

while(1){

……

}}在生成的工程代码中,编写用户程序主要涉及main.c和freertos.c这两个文件。主程序文件main.c中的初始化相关主要代码如下:8.2FreeRTOS的初始化配置函数MX_FREERTOS_Init()实现FreeRTOS的初始化,实现的主要功能是根据应用程序的需要,创建任务、队列、进程、信号量、互斥量等。特别注意到其中调用了定义在cmsis_os2.c文件中的osThreadNew()函数,创建了一个名为defaultTaskHandle的任务句柄。句柄名称的前缀为defaultTask,这是在CubeMX的Tasks面板中设置的默认任务名。FreeRTOS的初始化8.2FreeRTOS的初始化配置8.2FreeRTOS的初始化配置函数osKernelStart()是定义在cmsis_os2.c文件中的CMSIS-FreeRTOS接口函数,其中主要的操作是调用vTaskStartScheduler()函数启动任务调度器。与普通基于HAL库的应用程序不同的是,在基于RTOS的应用程序中,一旦启动任务调度器,main()函数中后面的代码(包括后面的while循环)将永远不会执行。程序执行流程的控制完全由FreeRTOS任务调度器接管。任务调度器的启动8.2FreeRTOS的初始化配置CubeMX中任务的创建8.2FreeRTOS的初始化配置在调用osThreadNew()函数时,第一个参数StartDefaultTask称为任务函数,该函数将实现具体的任务功能。任务函数及其定义在freertos.c文件中,自动创建的默认任务函数代码如下:voidStartDefaultTask(void*argument){ /*USERCODEBEGINStartDefaultTask*/ /*Infiniteloop*/ for(;;){ osDelay(1); } /*USERCODEENDStartDefaultTask*/}8.2FreeRTOS的初始化配置任务函数是一个死循环,将无限程序运行,for循环体应根据要求实现的功能编写替换。如果应用程序中还需要其他的任务,只需要在CubeMX再创建所需的任务。在生成的工程代码中,除了在MX_FREERTOS_Init()中再次调用osThreadNew()函数创建该任务以外,用户编写程序的主要工作就是在freertos.c文件中编写相应的任务函数,以便实现所需的应用功能。如果在CubeMX的工程管理器(ProjectManager)中不勾选Generateperipheralinitiation…选项,则FreeRTOS的初始化函数MX_FREERTOS_Init()和任务函数的定义代码都将自动放在main.c文件中,而不是在freertos.c文件中。8.2FreeRTOS的初始化配置【实践案例8-1】基于FreeRTOS工程的创建

本案例要求采用基于FreeRTOS的程序设计方法编写控制程序,实现开发板上红色LED以1s的间隔的不断闪烁。首先在CubeMX中配置系统时钟,配置开发板上连接红色LED的PF6为GPIO_Output模式。为了采用基于FreeRTOS的程序开发,还需要启用FreeRTOS,并做相关参数设置。这里假设FreeRTOS相关的所有参数都取默认配置。注意到在参数配置面板的TasksandQueues(任务和队列)选项卡中,默认创建了一个名为defaultTask的任务。8.2FreeRTOS的初始化配置与此相对应,在freertos.c文件的MX_FREERTOS_Init()中,通过调用osThreadNew()函数创建了该任务,并在该文件中创建了默认任务函数StartDefaultTask()。在上述默认任务函数中,将其中的for循环语句修改如下:8.2FreeRTOS的初始化配置8.3FreeRTOS编程基础8.3.1数据类型和代码格式8.3.2FreeRTOS的移植和裁减文件portmacro.h中将标准C语言中的一些基础数据类型(char、double等)重新定义,得到FreeRTOS程序中常用的数据类型符号。8.3.1数据类型和代码格式

8.3FreeRTOS编程基础变量名:字符型(int8_t)、短整型(int16_t)和长整型(int32_t)变量通常分别以c、s和l作为变量名的前缀,对其他非标准数据类型(例如结构体、任务句柄、队列句柄等),变量名通常以x为前缀。对于无符号整数,在前面再添加u表示,例如us表示uint16_t。对指针型变量可以附加p前缀。例如,一个uint8_t类型的变量,其名称前缀为uc。而对一个指向字符型变量的指针变量,其变量名前缀为pc,表示char*。变量及宏的命名规则8.3FreeRTOS编程基础函数名:函数名的前缀同时决定于其返回值的数据类型及函数定义所在的文件。例如,函数xTaskCreate()返回一个BaseType_t类型(也就是uint32_t类型)的变量,而函数vTaskDelete()没有返回值(void),两个函数都定义在task.c文件夹。宏名:宏常量和宏函数名通常用大写字母表示,小写字母前缀用于指示宏定义所在的位置。例如,portMAX_DELAY宏定义在portable.h或portmacro.h文件中,而taskENTER_CRITICAL宏定义在task.h文件中,configUSE_PREEMPTION宏定义在FreeRTOSConfig.h中。表8-3列出了常用的宏名称前缀。8.3FreeRTOS编程基础8.3FreeRTOS编程基础FreeRTOS的配置和功能裁减主要通过文件FreeRTOSConfig.h和FreeRTOS.h中的一些宏定义实现。文件FreeRTOS.h中的宏定义是系统默认的宏定义,不能直接修改,而FreeRTOSConfig.h是用户可修改的配置文件,如果一个宏没有在文件FreeRTOSConfig.h中重新定义,就使用文件FreeRTOS.h中的默认定义。8.3.2FreeRTOS的移植和裁减

8.3FreeRTOS编程基础在上述文件中的各种宏定义中,前缀为config的宏用于配置FreeRTOS的一些参数,而前缀为INCLUDE_的宏用于控制是否编译某些函数的源代码。例如,在文件FreeRTOSConfig.h中有如下宏定义:#define configMAX_TASK_NAME_LEN (12)其作用是设置FreeRTOS中任务名称的长度(字符数)为12。而如下宏定义:#define configCPU_CLOCK_HZ (SystemCoreClock)用于将CPU的时钟频率设置为系统时钟。8.3FreeRTOS编程基础在FreeRTOS.h头文件中,也有上述configMAX_TASK_NAME_LEN宏定义,相关代码如下:#ifndefconfigMAX_TASK_NAME_LEN #defineconfigMAX_TASK_NAME_LEN 16#endif这里用条件编译的形式给出该宏的定义。意思是,如果在FreeRTOSConfig.h中没有宏定义configMAX_TASK_NAME_LEN,就将其定义赋值为16。上述前缀为INCLUDE_的宏用于一些函数条件编译的条件,控制是否编译这些函数的源代码,从而实现对FreeRTOS的功能裁剪。8.3FreeRTOS编程基础8.4软件定时器8.4.1软件定时器特性8.4.2软件定时器相关函数【实践案例8-2】软件定时器的使用【照猫画虎8-2】软件定时器的使用在FreeRTOS中可以设置多个软件定时器,用于在设定时间或以固定的时间间隔定期执行某项操作。软件定时器基于系统滴答时钟运行,由FreeRTOS内核和程序实现,与硬件定时器无关。8.4.1软件定时器特性

与硬件定时器一样,在使用软件定时器前需要对其参数进行配置,其中主要包括工作模式和定时周期。定时周期指启动定时器和运行回调函数之间的时间间隔。8.4软件定时器软件定时器的工作状态可以为运行态(Running)和休眠态(Dormant)两种。在运行态,当定时器的指定时间到达后,将调用其回调函数。对处于休眠态的定时器,可通过句柄来访问,但是定时器不再运行,其回调函数也不会被调用。软件定时器的工作模式包括一次性定时和周期性定时,图8-8所示为这两种工作模式下的运行情况。8.4软件定时器8.4软件定时器上述函数都在timers.c/.h文件中定义和实现。在cmsis_os2_c/.h文件中,将上述各函数进一步封装为osTimerNew()、osTimerStart()、osTimerStop()、osTimerIsRunning()等函数。8.4.2软件定时器相关函数8.4软件定时器在FreeRTOS配置面板中,单击TimersandSemaphores(定时器和信号量)标签,再单击下面的Add按钮,即可创建软件定时器。在图8-9(a)中,假设创建的软件定时器名为ledTimer,Type属性指定为osTimerOnce(一次性定时),定时器回调函数名为ledTImerCallback,其他参数取默认配置。软件定时器的创建8.4软件定时器此外,单击配置面板中的Configparameters标签,找到Softwaretimerdefinitions(软件定时器定义),在其中设置软件定时器任务的优先级别足够高,即参数TIMER_TASK_PRIORITY数值足够大,如图8-9(b)所示。8.4软件定时器根据上述配置,在工程代码的freertos.c文件中,将自动调用osTimerNew()函数创建软件定时器,并对其进行初始化。该函数的原型声明如下:osTimerId_tosTimerNew(osTimerFunc_tfunc,osTimerType_ttype, void*argum

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论