freertos任务管理教学内容
freertos的流程,任务调度的基本步骤

freertos的流程,任务调度的基本步骤FreeRTOS的流程主要包括任务创建、任务调度和任务删除三个阶段。
任务创建的基本步骤如下:1. 创建任务:通过调用xT askCreate()函数创建一个任务,需要指定任务函数、任务名称、任务栈大小和任务优先级等参数。
2. 启动调度器:通过调用vTaskStartScheduler()函数启动任务调度器。
任务调度的基本步骤如下:1. 任务就绪队列:调度器会根据任务的优先级将就绪状态的任务加入到就绪列表中,按优先级从高到低排列。
2. 调度算法:调度器使用抢占式优先级调度算法,高优先级的任务总是会抢占低优先级的任务。
3. 任务切换:当一个任务被抢占时,调度器会保存当前任务的上下文,并加载下一个任务的上下文,完成任务切换。
4. 任务执行:被选中的任务会在其任务函数中执行,直到任务主动挂起或者因某种原因被抢占。
任务删除的基本步骤如下:1. 删除任务:通过调用vTaskDelete()函数删除当前任务。
2. 清理资源:任务删除后,可以在任务函数中清理使用的资源,如释放内存、关闭文件等操作。
以上是FreeRTOS任务调度的基本步骤,这些步骤是FreeRTOS实现多任务调度的基础。
freertos手册

freertos手册摘要:1.FreeRTOS 简介2.FreeRTOS 的特点3.FreeRTOS 的应用场景4.FreeRTOS 手册的主要内容5.如何使用FreeRTOS 手册正文:FreeRTOS 是一款开源实时操作系统,适用于各种嵌入式系统。
作为一个轻量级的操作系统,FreeRTOS 在资源有限的设备上表现出色,同时具有可扩展性和可靠性。
FreeRTOS 具有以下几个主要特点:1.可移植性:FreeRTOS 可以在多种处理器架构上运行,例如ARM、x86、MIPS 等。
2.小巧的内核:FreeRTOS 内核小巧,占用资源少,可以在有限的内存空间中运行。
3.实时性:FreeRTOS 具有实时性,可以满足对实时性要求较高的嵌入式系统。
4.可扩展性:FreeRTOS 提供了丰富的中间件和软件包,可以根据实际需求进行选择和配置。
5.稳定性:FreeRTOS 经过多年的发展和广泛的应用,已经变得非常稳定和可靠。
FreeRTOS 的应用场景非常广泛,包括但不限于以下几个方面:1.工业自动化:FreeRTOS 可以用于工业自动化设备,例如PLC、工控机等。
2.智能家居:FreeRTOS 可以用于智能家居设备,例如智能灯泡、智能插座等。
3.物联网:FreeRTOS 可以用于各种物联网设备,例如传感器节点、路由器等。
4.医疗设备:FreeRTOS 可以用于医疗设备,例如心电图仪、呼吸机等。
FreeRTOS 手册是使用FreeRTOS 的必备指南,其中包括了FreeRTOS 的详细使用方法和应用实例。
使用FreeRTOS 手册可以帮助开发者快速掌握FreeRTOS 的使用方法,提高开发效率。
使用FreeRTOS 手册的方法如下:1.首先,需要下载并安装FreeRTOS,可以从FreeRTOS 官网上下载最新版本。
2.熟悉FreeRTOS 的基本概念和原理,例如任务管理、时间管理、队列等。
3.阅读FreeRTOS 手册,了解FreeRTOS 的使用方法和应用实例。
freertos操作手册

freertos操作手册
FreeRTOS 是一个开源的实时操作系统,它提供了一个简单易用的 API,用于创建多任务应用程序。
以下是一些基本的 FreeRTOS 操作手册:
1. 创建任务:使用 `xTaskCreate()` 函数创建任务。
该函数需要传递任务的名称、任务函数、任务的栈大小、任务的优先级和任务的参数。
2. 任务调度:FreeRTOS 使用抢占式调度算法,最高优先级的任务将被执行。
可以使用 `vTaskStartScheduler()` 函数启动调度器。
3. 任务间通信:FreeRTOS 提供了多种任务间通信的方式,如信号量、消息队列和邮箱。
4. 时间管理:FreeRTOS 提供了定时器功能,可以使用 `xTimerCreate()` 函数创建定时器。
5. 内存管理:FreeRTOS 提供了内存管理功能,可以使用 `pvPortMalloc()` 函数分配内存。
以上是 FreeRTOS 的一些基本操作手册,如果你需要更详细的信息,可以查阅 FreeRTOS 的官方文档。
(2024年)FreeRTOS从入门到精通1

现已成为最受欢迎的嵌入式实 时操作系统之一
广泛应用于各种行业,包括汽 车、医疗、工业控制等
不断更新迭代,加入新功能和 优化性能
2024/3/26
5
主要特点与优势
可靠性
经过严格测试和验 证,具有高度的稳 定性
开放性
源代码公开,易于 学习和定制
2024/3/26
实时性
提供可预测的响应 时间,适合对时间 要求严格的应用
安装必要的驱动程序和组件
如串口驱动、JTAG驱动等,确保电脑与开发板正常 通信。
15
第一个FreeRTOS程序示例
创建FreeRTOS工程
在IDE中创建一个新的FreeRTOS工程,并配置相关参数。
编写任务代码
创建多个任务,并编写相应的任务处理函数,实现任务间的切换和通信。
编译和下载程序
将编写好的代码编译成可执行文件,并下载到开发板中进行测试。
功耗管理策略
分享多种功耗管理策略,如动态调 整系统时钟、关闭未使用外设、使 用低功耗模式等,降低系统功耗。
2024/3/26
功耗管理API介绍
介绍FreeRTOS提供的功耗管理相 关API,如tickless模式、低功耗模 式切换等,方便开发者进行功耗优
化。
功耗管理实践案例
分享在FreeRTOS中进行功耗优化 的实践案例,包括硬件平台选择、 软件架构设计、功耗测试方法等,
2024/3/26
备份和恢复
设计备份和恢复机制,确保系统数据安全和 可恢复性。
31
企业级应用部署注意事项
硬件兼容性
确保FreeRTOS与目标硬件兼容,充分发挥 硬件性能。
可扩展性规划
考虑系统未来扩展需求,设计可扩展的架构 和接口。
深入理解FreeRTOS的任务机制和消息队列+附完整项目代码

}
listGET_OWNER_OF_NEXT_ENTRY(pxCurrentTCB,&( pxReadyTasksLists[ uxTopReadyPriority ] ) ); // pxCurrentTCB指向最高优先级任务
//抢占同一优先级的下一个任务。
4.消息队列:
FreeRTOS中消息队列是任务间数据交换的常用手段(中断服务程序同样使用队列来通信与同步),消息队列是生产者消费者模型的重要组成部分
消息队列的数据结构如下:
typedef struct QueueDefinition
{
signed char *pcHead;//队头
signed char *pcTail;//队尾
任务一向消息队列填充数字,任务二从消息队列提取数据并发送到串口1,同时有LED灯跟随数据传送亮灭。
下载地址:
STM32搭载RTOS实现任务+消息队列+串口通信完整项目代码
主要讲讲任务和消息队列
1.任务控制模块(TCB被创建,并放入就绪列表。就绪列表是一个双向链表,在链表中每个任务按优先级排列,并且设置有记录相关信息的变量和进行各种操作的指针。
2.任务优先级
RTOS的基本工作单元是任务,所有任务都有一个用户优先级,如:从0到最高,如:0(最低),1,2,3 (最高) 在FreeRTOSConfig.h中设置优先级个数。
signed char *pcWriteTo;
signed char *pcReadFrom;
xList xTasksWaitingToSend;//等待发送的任务列表
xList xTasksWaitingToReceive;//等待接收的任务列表
freertos的课程设计

freertos的课程设计一、教学目标本课程旨在让学生了解和掌握FreeRTOS实时操作系统的基本原理和应用方法。
通过本课程的学习,学生将能够:1.理解实时操作系统的基本概念,包括任务、调度、同步等。
2.掌握FreeRTOS的关键特性,如多任务、抢占式调度、时间管理、内存管理等。
3.能够运用FreeRTOS进行嵌入式系统的开发,实现实时任务的管理和调度。
4.培养学生的动手实践能力和团队协作精神,提高他们解决实际问题的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.实时操作系统基础:介绍实时操作系统的概念、特点和应用领域,让学生了解实时操作系统的基本原理。
2.FreeRTOS概述:讲解FreeRTOS的核心功能、架构和关键特性,使学生对FreeRTOS有一个整体的认识。
3.FreeRTOS编程:详细讲解FreeRTOS的编程接口,包括任务创建、任务调度、事件处理等,让学生能够熟练使用FreeRTOS进行编程。
4.嵌入式系统设计:介绍如何使用FreeRTOS设计嵌入式系统,包括硬件选择、系统架构设计、驱动开发等,帮助学生掌握嵌入式系统的设计方法。
5.实践项目:安排学生进行实践项目,让学生将所学知识应用到实际项目中,提高他们的动手实践能力。
三、教学方法为了提高教学效果,本课程将采用多种教学方法相结合的方式进行教学:1.讲授法:讲解实时操作系统和FreeRTOS的基本概念、原理和编程方法。
2.案例分析法:分析典型的嵌入式系统设计案例,让学生了解FreeRTOS在实际项目中的应用。
3.实验法:安排学生进行实验,让学生动手实践,加深对FreeRTOS的理解。
4.讨论法:学生进行课堂讨论,鼓励学生提问、发表见解,提高他们的思考和表达能力。
四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:选用权威、实用的FreeRTOS教材,为学生提供系统的学习资料。
2.参考书:提供相关的嵌入式系统设计和实时操作系统方面的参考书,丰富学生的知识体系。
FreeRTOS实时内核使用指南-中文
当任务创建时,内核会分为每个任务分配属于任务自己的唯一状态。 usStackDepth 值用于告诉内核为它分配多大的栈空间。
这个值指定的是栈空间可以保存多少个字(word),而不是多少个字 节(byte)。比如说,如果是 32 位宽的栈空间,传入的 usStackDepth 值为 100,则将会分配 400 字节的栈空间(100 * 4bytes)。栈深度乘 以栈宽度的结果千万不能超过一个 size_t 类型变量所能表达的最大 值。
大多数嵌入式系统不仅能满足硬实时要求,也能满足软实时要求。
FreeRTOS
4
Designed For Microcontrollers;
© 2009 Richard Barry. Distribution or publication in any form is strictly prohibited.
xTaskCreate() API 函数 创建任务使用 FreeRTOS 的 API 函数 xTaskCreate()。这可能是所有 API 函数中最
复杂的函数,但不幸的是这也是我们第一个遇到的 API 函数。但我们必须首先掌控任务, 因为它们是多任务系统中最基本的组件。本书中的所有示例程序都会用到 xTaskCreate(),所以会有大量的例子可以参考。
仅仅从单处理器运行多线程这一点来说,实时嵌入式系统中的多任务与桌面电脑的 多任务从概念上来讲是相似的。但实时嵌入式系统的侧重点却不同于桌面电脑——特别 是当嵌入式系统期望提供”硬实时”行为的时候。
硬实时功能必须在给定的时间限制之内完成——如果无法做到即意味着整个系统 的绝对失败。汽车的安全气囊触发机制就是一个硬实时功能的例子。安全气囊在撞击发 生后给定时间限制内必须弹出。如果响应时间超出了这个时间限制,会使得驾驶员受到 伤害,而这原本是可以避免的。
freertos 任务调度策略
freertos 任务调度策略FreeRTOS任务调度策略FreeRTOS是一款开源的实时操作系统(RTOS),用于嵌入式系统应用。
它提供了一种灵活且可配置的任务调度策略,以满足各种需求。
任务调度策略是FreeRTOS用于管理和分配任务时间片的方法,它决定了各个任务之间的调度方式。
1. 先来先服务(First-Come, First-Served)调度策略:这是最简单的任务调度策略,任务按照它们被创建的顺序进行调度。
当一个任务的时间片用完后,会让出处理器给下一个任务。
这种策略适用于任务的优先级相同且对任务完成顺序没有特别要求的情况。
2. 优先级调度策略:FreeRTOS支持基于优先级的任务调度,每个任务都被赋予一个优先级,优先级越高的任务越容易获得处理器的时间片。
当有多个任务准备好运行时,FreeRTOS会选择优先级最高的任务来运行。
这种策略适用于任务之间有不同的紧急程度或重要性的情况。
3. 循环调度策略:在循环调度策略中,任务按照一定的顺序进行调度,每个任务都有一个时间片。
当一个任务的时间片用完后,它会排到队列的末尾等待下一轮调度。
这种策略适用于需要依次完成一系列任务的场景。
4. 抢占式调度策略:在抢占式调度策略中,任务可以被中断,即使它没有执行完。
任务的优先级决定了它可以被抢占的条件。
当一个高优先级任务准备好运行时,它会抢占正在执行的低优先级任务,并开始执行。
这种策略适用于需要实时性能和任务响应能力的场景。
5. 时间片轮转调度策略:时间片轮转是一种公平的调度策略,每个任务都被分配一个固定的时间片。
当一个任务的时间片用完后,它被放回就绪队列的末尾,让其他任务有机会运行。
这种策略适用于需要公平分配处理器时间的场景。
6. 最短剩余时间优先(Shortest Remaining Time Next, SRTN)调度策略:SRTN策略中,任务的优先级根据其剩余执行时间决定。
当一个任务运行时,FreeRTOS会检查其他就绪任务的剩余执行时间,并选择剩余时间最短的任务来进行抢占。
freertos函数手册
freertos函数手册(原创实用版)目录1.FreeRTOS 简介2.FreeRTOS 函数手册内容3.FreeRTOS 任务应用函数介绍4.使用 FreeRTOS 的注意事项5.总结正文1.FreeRTOS 简介FreeRTOS 是一款开源实时操作系统,适用于嵌入式系统。
它的名字来源于“FreeRTOS”,意为“免费的实时操作系统”。
FreeRTOS 具有轻量级、可扩展性和高可靠性等特点,广泛应用于各类嵌入式设备。
2.FreeRTOS 函数手册内容FreeRTOS 函数手册包含了丰富的函数,这些函数可以用于完成各种任务。
例如,可以用于创建任务、删除任务、更改任务的优先级等。
此外,手册还包括了一些用于处理中断的函数,以及用于与外部设备进行通信的函数。
3.FreeRTOS 任务应用函数介绍在 FreeRTOS 中,任务是核心概念之一。
通过使用任务,可以实现多任务并发,提高系统的运行效率。
FreeRTOS 提供了许多用于处理任务的函数。
例如:- xTaskCreate() 函数:用于创建一个新任务。
- xTaskDelete() 函数:用于删除一个任务。
- xTaskChangePriority() 函数:用于更改任务的优先级。
4.使用 FreeRTOS 的注意事项在使用 FreeRTOS 时,需要注意以下几点:- 确保系统时钟频率足够高,以保证实时性能。
- 合理设置任务的优先级,避免任务饥饿。
- 避免使用太多的全局变量,以减少任务间的相互影响。
- 正确处理任务间的同步与通信,避免死锁。
5.总结总的来说,FreeRTOS 是一款功能强大、易于使用的实时操作系统。
通过学习 FreeRTOS 函数手册,可以掌握如何在嵌入式系统中实现多任务并发,提高系统的运行效率。
freertos任务管理教学内容
freertos任务管理教学内容f r e e r t o s任务管理freertos是一个轻量级的rtos,它目前实现了一个微内核,并且port到arm7, avr, pic18, coldfire等众多处理器上;目前已经在rtos 的市场上占有不少的份额。
它当然不是一个与vxworks之类的rtos竞争的操作系统,它的目标在于低性能小RAM的处理器上。
整个系统只有3个文件,外加上port的和处理器相关的两个文件,实现是很简洁的。
与ucosii不同,它是free的,ucosii不是free的,虽然它的代码是公开的。
FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理。
FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。
FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。
这一点是和ucosii不同的。
另外一点不同是freertos既可以配置为可抢占内核也可以配置为不可抢占内核。
当FreeRTOS 被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。
这篇文章是以freertos v5.0版本的代码为例子分析下它的任务管理方面的实现。
时间关系可能没有太多时间写的很详细了。
1.链表管理freertos里面的任务管理,queue,semaphore管理等都借助于双向链表,它定义了个通用的数据结构/*定义链表节点??*/Struct xLIST_ITEM{portTickType xItemValue; //链表节点的数据项,通常用在任务延时,表示一个任务延时的节拍数volatile struct xLIST_ITEM * pxNext; //通过这两个成员变量将所有节点volatile struct xLIST_ITEM * pxPrevious;//链接成双向链表void * pvOwner; //指向该item的所有者,通常是任务控制块void * pvContainer; //指向此链表结点所在的链表};/*定义一个链表??*//*一个优先级一个链表??*/这个数据结构定义了一个通用的链表节点;下面的数据结构定义了一个双向链表typedef struct xLIST{volatile unsigned portBASE_TYPE uxNumberOfItems;//表示该链表中节点的数目volatile xListItem * pxIndex;//用于遍历链表,指向上次访问的节点volatile xMiniListItem xListEnd;//链表尾结点 /*指向链表中的最后一个节点?*/ } xList;而下面这个数据结构用在xList中,只是为了标记一个链表的尾,是一个markerstruct xMINI_LIST_ITEM{portTickType xItemValue;volatile struct xLIST_ITEM *pxNext;volatile struct xLIST_ITEM *pxPrevious;};typedef struct xMINI_LIST_ITEM xMiniListItem;对于链表的操作也定义了一系列的函数和宏,在list.c文件中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
f r e e r t o s任务管理freertos是一个轻量级的rtos,它目前实现了一个微内核,并且port到arm7, avr, pic18, coldfire等众多处理器上;目前已经在rtos的市场上占有不少的份额。
它当然不是一个与vxworks之类的rtos竞争的操作系统,它的目标在于低性能小RAM的处理器上。
整个系统只有3个文件,外加上port的和处理器相关的两个文件,实现是很简洁的。
与ucosii不同,它是free的,ucosii不是free的,虽然它的代码是公开的。
FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理。
FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。
FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。
这一点是和ucosii不同的。
另外一点不同是freertos既可以配置为可抢占内核也可以配置为不可抢占内核。
当FreeRTOS 被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行效率。
这篇文章是以freertos v5.0版本的代码为例子分析下它的任务管理方面的实现。
时间关系可能没有太多时间写的很详细了。
1.链表管理freertos里面的任务管理,queue,semaphore管理等都借助于双向链表,它定义了个通用的数据结构/*定义链表节点??*/Struct xLIST_ITEM{portTickType xItemValue; //链表节点的数据项,通常用在任务延时,表示一个任务延时的节拍数volatile struct xLIST_ITEM * pxNext; //通过这两个成员变量将所有节点volatile struct xLIST_ITEM * pxPrevious;//链接成双向链表void * pvOwner; //指向该item的所有者,通常是任务控制块void * pvContainer; //指向此链表结点所在的链表};/*定义一个链表??*//*一个优先级一个链表??*/这个数据结构定义了一个通用的链表节点;下面的数据结构定义了一个双向链表typedef struct xLIST{volatile unsigned portBASE_TYPE uxNumberOfItems;//表示该链表中节点的数目volatile xListItem * pxIndex;//用于遍历链表,指向上次访问的节点volatile xMiniListItem xListEnd;//链表尾结点 /*指向链表中的最后一个节点?*/ } xList;而下面这个数据结构用在xList中,只是为了标记一个链表的尾,是一个markerstruct xMINI_LIST_ITEM{portTickType xItemValue;volatile struct xLIST_ITEM *pxNext;volatile struct xLIST_ITEM *pxPrevious;};typedef struct xMINI_LIST_ITEM xMiniListItem;对于链表的操作也定义了一系列的函数和宏,在list.c文件中。
如初始化个链表,吧一个节点插入链表等。
初始化链表:void vListInitialise( xList *pxList ){/* The list structure contains a list item which is used to mark theend of the list. To initialise the list the list endis insertedas the only list entry. */pxList->pxIndex = ( xListItem * ) &(pxList->xListEnd );/* The list end value is the highest possible value in the list toensure it remains at the end of the list. */pxList->xListEnd.xItemValue = portMAX_DELAY;/* The list end next and previous pointers point to itselfso we knowwhen the list is empty. */pxList->xListEnd.pxNext = ( xListItem * ) &(pxList->xListEnd );pxList->xListEnd.pxPrevious = ( xListItem * ) &(pxList->xListEnd );pxList->uxNumberOfItems = 0;}把一个节点插入到链表尾部:void vListInsertEnd( xList *pxList, xListItem *pxNewListItem ){volatile xListItem * pxIndex;/* Insert a new list item into pxList, but rather than sortthe list,makes the new list item the last item to be removed by acall topvListGetOwnerOfNextEntry. This means it has to be theitem pointed to by the pxIndex member. */pxIndex = pxList->pxIndex;//指向最后访问的节点要被插入节点的前一个节点pxNewListItem->pxNext = pxIndex->pxNext;pxNewListItem->pxPrevious = pxList->pxIndex;pxIndex->pxNext->pxPrevious = ( volatile xListItem * )pxNewListItem;pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem;pxList->pxIndex = ( volatile xListItem * ) pxNewListItem;/* Remember which list the item is in. */pxNewListItem->pvContainer = ( void * ) pxList;( pxList->uxNumberOfItems )++;}这些就不多说了。
2.任务控制块typedef struct tskTaskControlBlock{volatile portSTACK_TYPE *pxTopOfStack; //指向堆栈顶xListItem xGenericListItem; //通过它将任务连入就绪链表或者延时链表或者挂起链表中xListItem xEventListItem; //通过它把任务连入事件等待链表unsigned portBASE_TYPE uxPriority; //优先级portSTACK_TYPE *pxStack; //指向堆栈起始位置signed portCHAR pcTaskName[configMAX_TASK_NAME_LEN ];#if ( portCRITICAL_NESTING_IN_TCB== 1 )unsignedportBASE_TYPE uxCriticalNesting;#endif#if (configUSE_TRACE_FACILITY == 1 )unsignedportBASE_TYPE uxTCBNumber; //用于trace,debug时候提供方便#endif#if ( configUSE_MUTEXES== 1 )unsignedportBASE_TYPE uxBasePriority; //当用mutex发生优先级反转时用#endif#if (configUSE_APPLICATION_TASK_TAG == 1 )pdTASK_HOOK_CODEpxTaskTag;#endif} tskTCB;其中uxBasePriority用于解决优先级反转,freertos采用优先级继承的办法解决这个问题,在继承时,将任务原先的优先级保存在这个成员中,将来再从这里恢复任务的优先级。
3.系统全局变量freertos将任务根据他们的状态分成几个链表。
所有就绪状态的任务根据任务优先级加到对应的就绪链表中。
系统为每个优先级定义了一个xList。
如下:static xList pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */此外,所有延时的任务加入到两个延时链表之一。
static xList xDelayedTaskList1;static xList xDelayedTaskList2;还定义了两个指向延时链表的指针:static xList * volatile pxOverflowDelayedTaskList;freertos弄出两个延时链表是因为它的延时任务管理的需要。
freertos根据任务延时时间的长短按序将任务插入这两个链表之一。
在插入前先把任务将要延时的xTicksToDelay数加上系统当前tick数,这样得到了一个任务延时due time(到期时间)的绝对数值。
但是有可能这个相加操作会导致溢出,如果溢出则加入到pxOverflowDelayedTaskList指向的那个链表,否则加入pxDelayedTaskList指向的链表。
freertos还定义了个pending链表:static xList xPendingReadyList;这个链表用在调度器被lock(就是禁止调度了)的时期,如果一个任务从非就绪状态变为就绪状态,它不直接加到就绪链表中,而是加到这个pending链表中。