@(嵌入式)
简述
前面了解了 FreeRTOS 的内存管理,接下来看看任务调度,这也是一个操作系统中最重要的一部分,而其任务调度大量使用了链表(list.c 实现),调度器使用链表跟踪不同状态下的任务(就绪、挂起、延时的任务,都会被挂接到各自的链表中),所以这里用一定篇幅介绍下主要供调度使用的链表文件是如何组织的。
我目前使用的源码版本是 v9.0.0
数据结构
FreeRTOS 链表中主要的数据结构是链表(xLIST)和链表项(xLIST_ITEM),以及一个低配的链表项(xMINI_LIST_ITEM)包含于链表中,具体定义和作用下面介绍。定义内容在 Source/include/list.h
xLIST_ITEM
链表项就是链表每个节点的数据结构,其每个成员的具体作用如注释所示。
其中开头和结尾两个宏的作用是检查数据是否完整,当设置 Source/include/projdefs.h
configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 为1的时候,以下结构体会在开始和结尾添加两个变量存储 Magic number(0x5a5a…)供校验。
(后面说明假设没有开启校验)
struct xLIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
// 保存如任务优先级(任务切换)、阻塞时间(延时挂起时)等信息
// 供列表排序用,递减
configLIST_VOLATILE TickType_t xItemValue;
// 指向下一个节点
struct xLIST_ITEM * configLIST_VOLATILE pxNext;
// 指向上一个节点
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;
// 指向对象,主要是 TCB
void * pvOwner;
// 指向所属链表 xLIST
void * configLIST_VOLATILE pvContainer;