FreeRTOS——任务管理

1. FreeRTOS 任务不允许以任何方式从实现函数中返回——他们绝不能有一条“return”语句,也不可能执行到函数的末尾。如果一个函数不需要,可以将其删除,如在任务中使用函数vTaskDelete(NULL),将当前任务删除。

2. 在启动任务调度器(osKernelStart() )前,最好只创建一个起始任务,在启动任务调度器(osKernelStart() )后,在起始任务中创建其他的任务,此时建议关闭中断。如 taskENTER_CRITICAL() ,...《创建任务》... taskEXIT_CRITICAL() 。

3. 优先级数目的最大值,为 FreeRTOSConfig.h 中 configMAX_PRIORITIES 的值。FreeRTOS本身并没有限定这个最大值,但是这个值越大,内核花销的内存就越大。故建议尽量将此常量设到可接受的最小值。

4. 在 《FreeRTOS V8.2.1》 中定义任务优先级的有效范围是从-3到 configMAX_PRIORITIES-3-1 。需要注意的是 ① 多个任务可以共用一个优先级;② 优先级号越小的任务优先级越低,如优先级号-3表示优先级最低。注,ARM的优先级号越小则优先级越高。

5. FreeRTOS在进行任务调度时,若多个优先级相同且最高的任务均进入就绪状态,则调度器会让这些任务轮流执行,即时间片轮转调度。

6. 阻塞状态:如果一个任务正在等待某个事件发生,则称这个任务处于“阻塞态(blocked)”。任务可以进入阻塞态以等待两种不同类型的事件:

1)定时(时间相关)时间——这类事件可以是延迟到期或是绝对时间到。比如某个任务可以进入阻塞态以延迟10ms。

2)同步时间——源于其他任务或中断事件。例如,某个任务进入阻塞态以等待队列中有数据到来。同步时间囊括了所有板级范围的事件类型。

7. 挂起状态:处于挂起状态的任务对调度器而言是不可见的。当然,大多数应用程序都不会挂起某个任务。

1)挂起任务:唯一方法就是调用 vTaskSuspend() API 函数。

2)恢复任务:唯一方法就是调用 vTaskResume() 或 vTaskResumeFromISR() API 函数。

8. 完整任务状态机如下图所示。

9. 系统在启动任务调度器时,自动创建空闲任务(优先级最低),以保证系统在任一时刻,至少有一个任务可运行。

10. 空闲任务的钩子函数(或称回掉函数,hook,or call-back),用户可以直接在空闲任务的钩子函数中添加应用程序的相关功能。空闲任务每运行一次就会调用一次钩子函数。若使用空闲任务钩子函数,则在FreeRTOSConfig.h 中 configUSE_IDLE_HOOK 必须定义为1。

1)空闲任务钩子函数的作用:

a)执行低优先级,后台或需要不停处理的功能代码。

b)测试系统的处理裕量:空闲任务只会在其他所有任务都不运行时,才有机会运行,所以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富裕的处理时间。

c)将处理器配置到低功耗模式——提供一种自动省电的方法,使得在没有任何应用功能需要处理的时候,系统自动进入省电模式。

2)空闲任务钩子函数的实现限制

a)绝对不能够阻塞或挂起。空闲任务只有在其他任务不运行时才会被执行(除非有应用任务共享空闲任务优先级)。以任何方式阻塞空闲任务都可能导致没有任务进入运行态。

b)如果应用程序用到了 vTaskDelete()AP 函数,则空闲任务的钩子函数必须尽快返回,因为在任务被删除后,空闲任务负责回收内核资源。如果空闲任务一直处于钩子函数中,则无法进行收回。

11. 在创建任务时定义了任务的优先级,启动调度器后,可以使用 vTaskPriofitySet() 改变任何任务的优先级。

12. 任务可以使用 vTaskDelete() API 删除自己或其他任务。任务被删除后就不复存在,也不会进入运行态。任务一旦被删除,空闲任务就会将已删除的任务的内存释放掉,因此,千万不能把空闲任务的执行时间饿死。说明:只有内核为任务分配的内存空间才会在任务被删除后自动收回,任务自己占用的内存或资源需要由引用程序自己显示地释放。

13. FreeRTOS的常用的任务调度方案被称为“固定优先级抢占式调度”。

固定优先级”是指每一个任务都赋予一个优先级,这个优先级不能被内核本身改变,只能被任务修改。

抢占式”是指当任务进入就绪态或优先级改变时,若处于运行态的优先级更低,则该任务总是抢占当前运行的任务。

FreeRTOS还可以采用协作式调度。

采用一个纯粹的协作式调度器,只可能在运行态任务进入阻塞态或是运行态任务显示调用 taskYIELD() 时,才会进行上下文切换。任务永远不会被抢占,而具有相同优先级的任务也不会自动共享处理器时间。协作调度的这种工作方式虽然比较简单,但可能导致系统响应不够快。

FreeRTOS还可以采用混合调度方案,这时需要在中断服务例程中显示地进行上下文切换,从而允许同步事件产生抢占式行为,但时间时间却不行。这样做的结果是得到一个没有时间片机制的抢占式系统。这也是一种常见的调度器配置。

14. 如何设置任务优先级?

作为一种通用的规则,完成硬实时功能的任务优先级高于完成软实时任务的优先级。但其他一些因素,比如执行时间和处理器的利用率,也要纳入考虑范围之内,以保证应用程序不会超过硬实时的需求限制。

15. 单步速率调度(Rate Monotonic Scheduling,RMS:是一种常用的优先级分配技术。其根据任务周期性执行的速率来分配一个唯一的优先级。具有最高周期执行频率的任务被赋予最高的优先级;具有最低执行频率的任务被赋予最低优先级。

这种优先级分配方式被证明了可以最大化整个应用程序的可调度性(schedulability),但是运行时间不定及并非所有任务都具有周期性,会使得对这种方式的全面计算变得复杂。

时间: 2024-07-28 20:41:08

FreeRTOS——任务管理的相关文章

FreeRTOS分析

freertos是一个轻量级的rtos,它目前实现了一个微内核,并且port到arm7, avr, pic18, coldfire等众多处理器上:目前已经在rtos的市场上占有不少的份额.它当然不是一个与vxworks之类的rtos竞争的操作系统,它的目标在 于低性能小RAM的处理器上.整个系统只有3个文件,外加上port的和处理器相关的两个文件,实现是很简洁的.与ucosii不同,它是free的,ucosii不是free的,虽然它的代码是公开的.FreeRTOS提供的功能包括:任务管理.时间管

FreeRTOS 使用指南(转)

源:FreeRTOS 使用指南 繁星电子开发团队制作 作为一个轻量级的操作系统,FreeRTOS 提供的功能包括:任务管理.时间管理.信号量.消息队列.内存管理.记录功能等,可基本满足较小系统的需要.FreeRTOS 内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU 总是让处于就绪态的.优先级最高的任务先运行.FreeRT0S 内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU 的使用时间. F

FreeRTOS的学习路线

背景 由于之前接触过一些嵌入式RTOS,如Keil-RTX,uCOS-II,也曾经关注过FreeRTOS,但一直没有机会采用FreeRTOS开发.目前FreeRTOS做为主流RTOS,风声正盛.作为嵌入式开发从业人员,貌似没有使用过FreeRTOS,竞争力指数会直线降低.最近,刚巧项目中使用了STM32f103芯片.由于RTOS的可以更合理.更有效地利用CPU的资源,简化应用软件的设计,缩短系统开发时间,更好地保证系统的实时性和可靠性.由于对FreeRTOS好奇的倾向性,所以,本次决定采用Fre

从0开始的FreeRTOS(2)

"从0开始的FreeRTOS"系列教程第二讲 作者:satori 这一期教程中,我们将介绍FreeRTOS源码的内容,如何使用cubemx快速生成一个包含freertos的工程,以及包含freertos的工程的结构. https://sourceforge.net/projects/freertos/files/FreeRTOS/ 在上面的网址中下载FreeRTOS源码之后我们得到一个压缩包 解压之后我们看到如下的文件,其中FreeRTOS文件夹中包含了源码和一些平台上的实例demo,

从0开始的FreeRTOS(1)

"从0开始的FreeRTOS"系列教程第一讲 作者:satori 大家好,这次给大家带来了Freertos的教程. 这个系列的教程的主要目的是带大家了解实时系统(real time operating system)的基本概念,熟悉freertos的api使用方法,具备基本的使用rtos进行工程开发的能力 系列计划分几期录完,内容分别为 任务管理 队列管理 软件定时器管理 中断管理 资源管理 事件组 任务通知 本教程的开发环境: 硬件环境 stm32f103ZET6 软件版本 Keil

从0开始的FreeRTOS(4)

"从0开始的FreeRTOS"系列教程第四讲 作者:satori 这一次我们来进行基于FreeRTOS的任务管理实验. 在开讲之前,推荐一下Zou Changjun翻译的FreeRTOS实时内核使用指南(官方网站上的英文原名是Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide),在后面讲解API时我们力求精简易懂,所以不会说太多详细的内容,具体可以参见该文档和官方API手册(文末有本文档的下载链接). 回顾

在STM32F746G-DISCO开发板上使用Nabto + FreeRTOS的演示热泵应用

当使用STM32 ARM Cortex-M微控制器时,ST的免费嵌入式软件STM32Cube提供了所有必要的驱动程序和中间件组件,以减少初始的开发工作.在上述提到的中间件组件中,其中一个是非常受欢迎的FreeRTOS实时操作系统,Nabto正在努力建立一个强大的FreeRTOS + Nabto组合的解决方案. 我们最新推出AppMyProduct应用平台可帮助您快速开发远程控制设备的高质量应用程序.本文介绍了在STM32F746G-DISCO开发板上使用Nabto + FreeRTOS的演示热泵

FreeRTOS和Linux相比

两个不沾边.    freertos 是一个实时操作系统,主要实现了任务调度.内存管理.IPC.中断管理这几个模块,它要求快速的处理任务,gui.驱动框架.shell 这些都不是它的核心功能,而且大部分情况下都不会做,因为一旦freertos 运行起来之后,是不会有人工介入的,可以 google 一下什么是实时操作系统.. Linux ,这里应该指的是 kernel 一部分,它就不同了,它是一种通用操作系统,实现的功能和实现的目标和 freertos 不一样,它的第一要务是让用户能够方便的使用电

Linux进程控制和计划任务管理

程序是保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合,而进程是在CPU及内存中处于动态执行状态的计算机程序.在Linux中,每个程序启动后可以创建一个或多个进程. ps命令   查看静态的进程统计信息 ps         只显示当前用户会话中打开的进程 ps  aux    以简单列表的形式显示出进程信息 ps  -elf   以长格式显示系统中的进程信息,包括更丰富的内容 top命令   查看进程动态信息 在当前终端已交互式的界面显示进程排名,及时跟踪CPU.内存等系统资源占