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),但是运行时间不定及并非所有任务都具有周期性,会使得对这种方式的全面计算变得复杂。

16. 任务的堆栈大小:栈深度 X 栈宽度

注:栈大小不能超过Size_t 类型变量所能表达的最大值。

例. 32位宽的栈空间,若栈深度为100,则栈大小为 100 X 4 = 400 (Byte)

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

  1. FreeRTOS --(7)任务管理之入门篇

    转载自 https://blog.csdn.net/zhoutaopower/article/details/107019521 任务管理是操作系统中重中之重,不管什么 OS ,任务的调度管理都是核心 ...

  2. freertos之特点

    主要特点:协程(co-routine):任务间的中断通信机制              支持可抢占式/协作式任务调度 .FreeRTOS-MPU              内核对象可以动态或静态分配 ...

  3. FreeRTOS学习笔记——FreeRTOS 任务基础知识

    RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能,初步上手RTOS 系统首先必须掌握的也是任务的创建 ...

  4. 【FreeRTOS学习03】小白都能懂的Task Management 任务管理基本概念介绍

    在FreeRTOS中,线程的术语又可以被称之为任务,或许这样更加合适,本文将介绍任务的创建/删除,任务参数的使用,以及任务优先级: 1 软实时和硬实时 硬实时系统的任务运行正确性与响应时限是紧密相关的 ...

  5. FreeRTOS --(11)任务管理之系统节拍

    转载自 https://blog.csdn.net/zhoutaopower/article/details/107146764 前面有了创建任务.启动调度器.任务控制,接下来便开始分析一个 Tick ...

  6. FreeRTOS --(10)任务管理之任务延时

    转载自 https://blog.csdn.net/zhoutaopower/article/details/107101723 在<FreeRTOS --(7)任务管理之入门篇>中讲过, ...

  7. FreeRTOS --(9)任务管理之启动调度器

    转载自 https://blog.csdn.net/zhoutaopower/article/details/107057528 在使用 FreeRTOS 的时候,一般的,先创建若干任务,但此刻任务并 ...

  8. FreeRTOS --(8)任务管理之创建任务

    转载自https://blog.csdn.net/zhoutaopower/article/details/107034995 在<FreeRTOS --(7)任务管理之入门篇>文章基本分 ...

  9. (41)freeRTOS之任务管理

    1. 简介: 在 FreeRTOS 中没有线程和进程的区别,只有一个被翻译成任务的程序,相当于进程的概念,拥有独立的栈空间. 对于实时性,可以分为 软实时.硬实时:桌面电脑的输入处理可以看做是软实时, ...

随机推荐

  1. canvas——随机生成迷宫

    先上图. 效果 代码 随机生成迷宫要求任意两点都能够找到相同的路径,也就是说,迷宫是一个连通图.随机生成迷宫可以使用普里姆算法.广度优先算法.深度优先算法等实现.这里将使用普里姆算法通过生成最小数的方 ...

  2. 关于 vue-cli v2.8.2

    我在撰写<Vue2实践揭秘>时采用的 vue-cli 版本是 v2.5.1,由于实体书的出版周期比电子书的要长,所以到全书出版vue-cli已经更新到 v2.8.2 了,我在书中曾经对 v ...

  3. dede系统自定义变量删除方法

    之前添加了个联系电话的系统变量,忘记写描述,结果就显示个冒号,很难看.这样的就要删除了重来,那么织梦怎么删除添加的变量呢?其实很简单.两种方法: 第一种:执行SQL语句.在织梦后台执行-系统-SQL命 ...

  4. BOM(1)

    BOM 浏览器对象模型(Browser Object Model),使浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器"对话". 浏览器对象模型(Browser ...

  5. 原生和jQuery的ajax用法

    jQuery的ajax方法: $.ajax({ url:'/comm/test1.php', type:'POST', //GET async:true, //或false,是否异步 data:{ n ...

  6. python学习-面向对象

    面向对象 编程方式的区别 过程式编程 函数式编程 面向对象式编程 面向对象编程 对象是类的一个实例 创建 class foo(): def __init__(self): #类的构造方法 pass d ...

  7. JavaScript中for循环的使用详解

    or循环是循环最紧凑的形式,并包含有以下三个重要部分组成: 循环初始化计数器的初始值.初始化语句执行循环开始之前. 测试语句,将测试如果给定的条件是真还是假.如果条件为真,那么将要执行的循环中给定的代 ...

  8. Java基础语法实例(2)——实习第二天

    来到广州实习的第二天,广州好潮湿,这就是我的感觉,手表里面都开始产生了水雾,这就尴尬了...每天不断的雨.好吧,尽管我很喜欢这里的树,但是我以后应该也不会再来广州了,其实也说不准.想起了<谁动了 ...

  9. Windows下安装Python扩展模块提示Unable to find vcvarsall.bat的问题

    本文内容 Unable to find vcvarsall.bat的问题描述 问题分析 总结 提示: 如果你只是想知道自己需要安装哪个版本的Visual Studio请直接查看本文最后一个小节的内容. ...

  10. 学习mysql语法--基础篇(一)

      前  言  mysql  mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分:    一.创建用户,创建数据库,给 ...