目录
一、什么是列表和列表项
1、概念
在FreeRTOS中,有三个列表分别是就绪列表、阻塞列表与挂起列表。当任务状态改变就会迁移到其他列表中。
列表是一个双向环形链表,而链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。链表可以任意的插入与删除节点,并且不限制元素的数量。
列表项是存放在列表中的项目,用来存放FreeRTOS中的任务。
以右图举例,三个人组成的整体就作为一个列表,而每个人是这个列表中的列表项。列表项之间地址是非连续,是人为的连接到一起的。是依靠列表项中的pxNext(指向下一个地址指针)、pxPrevious(指向上一个地址指针)互相连接。相当于右图中的胳膊互相拉着。
2、FreeRTOS代码
(1)列表
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE /*用来检测列表完整性*/
volatile UBaseType_t uxNumberOfItems; /*列表中列表项个数*/
ListItem_t * configLIST_VOLATILE pxIndex; /*指向列表项的指针 */
MiniListItem_t xListEnd; /*末尾列表项,由迷你列表项定义*/
listSECOND_LIST_INTEGRITY_CHECK_VALUE /*用来检测列表完整性*/
} List_t;
(2)列表项
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; /*上一个列表项*/
void * pvOwner; /*任务控制块 */
struct xLIST * configLIST_VOLATILE pxContainer; /*列表项所在列表 */
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*校验值 */
};
typedef struct xLIST_ITEM ListItem_t;
(3)迷你列表项
struct xMINI_LI