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),但是运行时间不定及并非所有任务都具有周期性,会使得对这种方式的全面计算变得复杂。
16. 任务的堆栈大小:栈深度 X 栈宽度
注:栈大小不能超过Size_t 类型变量所能表达的最大值。
例. 32位宽的栈空间,若栈深度为100,则栈大小为 100 X 4 = 400 (Byte)
FreeRTOS——任务管理的更多相关文章
- FreeRTOS --(7)任务管理之入门篇
转载自 https://blog.csdn.net/zhoutaopower/article/details/107019521 任务管理是操作系统中重中之重,不管什么 OS ,任务的调度管理都是核心 ...
- freertos之特点
主要特点:协程(co-routine):任务间的中断通信机制 支持可抢占式/协作式任务调度 .FreeRTOS-MPU 内核对象可以动态或静态分配 ...
- FreeRTOS学习笔记——FreeRTOS 任务基础知识
RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能,初步上手RTOS 系统首先必须掌握的也是任务的创建 ...
- 【FreeRTOS学习03】小白都能懂的Task Management 任务管理基本概念介绍
在FreeRTOS中,线程的术语又可以被称之为任务,或许这样更加合适,本文将介绍任务的创建/删除,任务参数的使用,以及任务优先级: 1 软实时和硬实时 硬实时系统的任务运行正确性与响应时限是紧密相关的 ...
- FreeRTOS --(11)任务管理之系统节拍
转载自 https://blog.csdn.net/zhoutaopower/article/details/107146764 前面有了创建任务.启动调度器.任务控制,接下来便开始分析一个 Tick ...
- FreeRTOS --(10)任务管理之任务延时
转载自 https://blog.csdn.net/zhoutaopower/article/details/107101723 在<FreeRTOS --(7)任务管理之入门篇>中讲过, ...
- FreeRTOS --(9)任务管理之启动调度器
转载自 https://blog.csdn.net/zhoutaopower/article/details/107057528 在使用 FreeRTOS 的时候,一般的,先创建若干任务,但此刻任务并 ...
- FreeRTOS --(8)任务管理之创建任务
转载自https://blog.csdn.net/zhoutaopower/article/details/107034995 在<FreeRTOS --(7)任务管理之入门篇>文章基本分 ...
- (41)freeRTOS之任务管理
1. 简介: 在 FreeRTOS 中没有线程和进程的区别,只有一个被翻译成任务的程序,相当于进程的概念,拥有独立的栈空间. 对于实时性,可以分为 软实时.硬实时:桌面电脑的输入处理可以看做是软实时, ...
随机推荐
- 【小练习04】HTML+CSS--医药健康小页面
要求实现如下效果图: 代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- mysql之 MySQL 主从基于 GTID 复制原理概述
一. 什么是GTID ( Global transaction identifiers ):MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid ...
- ORA-12638: 身份证明检索失败 解决方法
用PL/SQL或Navicat连接本地或远程Oracle数据库的时候报错:ORA-12638: 身份证明检索失败 解决方法: 开始 -> 所有程序 -> Oracle - Oracle_h ...
- flask笔记二
web表单 web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互. 1.用Flask-WTF来处理表单 (1)在根目录下编辑扩展配置--config.py CSRF_ENABLE ...
- 简单轻量级的一套JS 类库(RapidDevelopmentFramework.JS)
1.最近好久没有更新自己的博客了,一直在考虑自己应该写一些什么.4.2日从苏州回到南京的路上感觉自己的内心些崩溃和失落,我就不多说了? 猛然之间我认为自己需要找一下内心的平衡.决定开发属于自己一套快速 ...
- svn文件图
- 几种MQ消息队列对比与消息队列之间的通信问题
消息队列 开发语言 协议支持 设计模式 持久化支持 事务支持 负载均衡支持 功能特点 缺点 RabbitMQ Erlang AMQP,XMPP,SMTP,STOMP 代理(Broker)模式(消息在发 ...
- 【Android Developers Training】 92. 序言:使用同步适配器传输数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 手机cpu结构,arm
问题描述 今天测试人员测试集成版本时除了一个bug:关于华为 Mate 8手机Android 6.0系统运行刚刚提测的版本时,出现闪退的bug,而小米 4 手机Android 6.0系统却没有出现任何 ...
- 再谈AbstractQueuedSynchronizer:基于AbstractQueuedSynchronizer的并发类实现
公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...