FreeRTOS学习记录
教材教参:野火教程《FreeRTOS内核实现与应用开发实战指南:基于STM32》刘火良,杨森
正点原子教程《STM32F1 FreeRTOS开发手册 V1.1》左忠凯
1.初识FreeRTOS
Jan.22th,2020,Wed
移植FreeRTOS内核文件
TCB:Task Control Block(任务控制块)
ISR:Interrut Server Request(中断服务请求)
Jan.23th,2020,Thu
获取一个调度器的状态
Jan.24th,2020,Fri New Year's Eve
2.链表
Jan.25th,2020,Sat New Year
链表
Jan.26th,2020,Sun
链表
Feb.6th,2020,Thu
列表
列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。与列表相关的全部东西
都在文件list.c和list.h中。在list.h中定义了一个叫List_t的结构体,如下:
typedef struct xLIST
{
listFIRST_LIST_INCLUDE_CHECK_VALUE (1)
configLIST_VOLATILE UBaseType uxNumberOfItems; (2)
ListItem_t *configLIST_VOLATILE pxIndex; (3)
MiniListItem_t xLISTEnd; (4)
listSECOND_LIST_INTEGRITY_CHECK_VALUE (5)
}List_t;
(1)和(5),这两个都是用来检测列表完整性的,需要将宏configUSE_LIST_DATA_CHECK_BYTES设置为1,开启以后会向这两个
地方分别添加一个变量xListIntergrityValue1和xListIntegrityValue2,在初始化列表的时候对这两个变量中写入一个特殊的值,
默认不开启这个功能。
(2)uxNumberOfItems用来记录当前列表项的数量
(3)pxIndex用来记录当前列表项索引号,用于遍历列表
(4)列表中最后一个列表项,用来表示列表结束,此变量类型为MiniListItem_t 这是一个迷你列表项
列表
________________
|uxNumberOfItems |
________________
|pxIndex |
_________________
|xListEnd |
_________________
列表示意图
图中并未列出用于列表完整性检查的成员变量
列表项就是放在列表中的项目,FreeRTOS提供了两种类表项:列表项和迷你列表项。这两个都在list.h中
有定义,列表项定义如下:
struct xLIST_ITEM
{
listFIRST_LIST_INCLUDE_CHECK_VALUE (1)
configLIST_VOLATILE TickType_t xItemValue; (2)
struct xLIST_ITEM *configLIST_VOLATILE pxNext; (3)
struct xLIST_ITEM *configLIST_VOLATILE pxPrevious; (4)
void * pvOwner; (5)
void *configLIST_VOLATILE pvContainer;(6)
listSECOND_LIST_INTEGRITY_CHECK_VALUE (7)
};
typedef struct xLIST_ITEM ListItem_t;
typedef struct xLIST_ITEM ListItem_t;
(1)和(7)用法和列表一样,用来检查列表项完整性
(2)xItemvalue为列表项值
(3)pxNext指向下一个列表项
(4)pxPrevious指向前一个列表项,和pxNext配合起来实现类似双向链表的功能。
(5)pxOwner记录此链表项归谁拥有,通常是任务控制块
(6)pvContainer用来记录此列表项归哪个列表。注意和pvOwner的区别,在前面讲解任务控制块TCB_t的时候说了
在TCB_t中有两个变量xStateListItem和xEventListItem,这两个变量的类型就是ListItem_t,这两个成员变
量都是列表项。以xStateListItem为例,当创建一个任务以后xStateListItem的pvOwner变量就指向这个任
务的任务控制块,表示xStateListItem属于此任务。当任务就绪态以后xStateListItem的变量就指向pvContainer
就指向就绪列表,表明此列表项在就绪列表中。For example:小王在上二年级,他的父亲是老王。如果把
小王比作列表项,那么小王的pvOwner属性值就是老王,小王的pvContainer属性值就是二年级。
列表项
____________
|xItemValue |
____________
|pxNext |
____________
|pxPrevious |
____________
|pvOwner |
____________
|pvContainer|
_____________
列表项示意图
迷你列表项
struct xMINI_LIST_ITEM
{
listFIRST_LIST_INCLUDE_CHECK_VALUE (1)
configLIST_VOLATILE TickType_t xItemValue; (2)
struct xLIST_ITEM *configLIST_VOLATILE pxNext; (3)
struct xLIST_ITEM *configLIST_VOLATILE pxPrevious; (4)
};
typedef struct xLIST_ITEM
(1)用来检查列表项完整性
(2)xItemvalue为列表项值
(3)pxNext指向下一个列表项
(4)pxPrevious指向前一个列表项,和pxNext配合起来实现类似双向链表的功能。
可以看出迷你列表项只是比列表少了几个成员变量,迷你列表项有的成员变量列表项都有的,
那为什么要弄个迷你列表项?那是因为有些情况下我们不需要列表项那么全的功能,可能只需要
其中的某几个成员变量,如果此时用列表项的话会造成内存的浪费!如此上面里列表结构体List_t
中表示最后一个列表项的成员变量xListEnd就是MiniListItem_t类型的。
Mini列表项
____________
|xItemValue |
____________
|pxNext |
____________
|pxPrevious |
____________
迷你列表项示意图
列表和列表项初始化
新创建或者定义的列表需要对其做初始化处理,列表的初始化其实就是初始化列表结构体
List_t中的各个成员变量,列表的初始化通过使函数vListInitialise()来完成,此函数在
list.c中有定义,函数如下:
void vListInitialise( List_t * const pxList )
{
/* The list structure contains a list item which is used to mark the
end of the list. To initialise the list the list end is inserted
as the only list entry. */
pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); (1) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is ch