1.列表
列表是 FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪 FreeRTOS
中的任务。与列表相关的全部东西都在文件 list.c 和 list.h 中。在 list.h 中定义了一个叫 List_t 的
结构体。
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE
configLIST_VOLATILE UBaseType_t
uxNumberOfItems;//用来记录列表中列表项的数量。
ListItem_t * configLIST_VOLATILE
pxIndex;//用来记录当前列表项索引号,用于遍历列表。
MiniListItem_t//列表中最后一个列表项,用来表示列表结束,这是一个迷你列表项
xListEnd;
listSECOND_LIST_INTEGRITY_CHECK_VALUE
} List_t;

2.列表项
列表项就是存放在列表中的项目,FreeRTOS 提供了两种列表项:列表项和迷你列表项。
struct xLIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
configLIST_VOLATILE TickType_t
xItemValue; //xItemValue 为列表项值。
struct xLIST_ITEM * configLIST_VOLATILE pxNext; //pxNext 指向下一个列表项
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; //pxPrevious 指向前一个列表项
void *pvOwner; //pvOwner 记录此链表项归谁拥有,通常是任务控制块
void * configLIST_VOLATILE //pvContainer 用来记录此列表项归哪个列表
pvContainer;
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE
};
typedef struct xLIST_ITEM ListItem_t;

3.迷你列表项
struct xMINI_LIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
configLIST_VOLATILE TickType_t
xItemValue;
struct xLIST_ITEM * configLIST_VOLATILE pxNext;
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;

4.相关函数
列表初始化
void vListInitialise( List_t * const pxList )
列表项初始化
void vListInitialiseItem( ListItem_t * const pxItem )
列表项插入
void vListInsert( List_t * const pxList,ListItem_t * constpxNewListItem )
要插入的位置由列表项中成员变量xItemValue 来决定。列表项的插入根据 xItemValue 的值按照升序的方式排列!



列表项末尾插入
void vListInsertEnd( List_t * const pxList,ListItem_t * const pxNewListItem )
这里所谓的末尾要根据列表的成员变量pxIndex 来确定的!前面说了列表中的 pxIndex 成员变量是用来遍历列表的,pxIndex 所指向的列表项就是要遍历的开始列表项,也就是说 pxIndex 所指向的列表项就代表列表头!由于是个环形列表,所以新的列表项就应该插入到 pxIndex 所指向的列表项的前面。


列表项的删除
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
注意,列表项的删除只是将指定的列表项从列表中删除掉,并不会将这个列表项的内存给释放掉!如果这个列表项是动态分配内存的话。
5.代码
cs
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#define Start_Task_Size 120
#define Start_Task_Prio 1
TaskHandle_t Start_Task_Handler;
void Start_Task(void *pvParamaters);
#define Task1_Task_Size 120
#define Task1_Task_Prio 2
TaskHandle_t Task1_Task_Handler;
void Task1_Task(void *pvParamaters);
#define List_Task_Size 120
#define List_Task_Prio 3
TaskHandle_t List_Task_Handler;
void List_Task(void *pvParamaters);
List_t TestList;
ListItem_t ListItem1;
ListItem_t ListItem2;
ListItem_t ListItem3;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
xTaskCreate( (TaskFunction_t) Start_Task,
(char *) "Start_Task",
(configSTACK_DEPTH_TYPE) Start_Task_Size,
(void *) NULL,
(UBaseType_t) Start_Task_Prio,
(TaskHandle_t *) &Start_Task_Handler );
vTaskStartScheduler();
}
void Start_Task(void *pvParamaters)
{
xTaskCreate( (TaskFunction_t) Task1_Task,
(char *) "Task1_Task",
(configSTACK_DEPTH_TYPE) Task1_Task_Size,
(void *) NULL,
(UBaseType_t) Task1_Task_Prio,
(TaskHandle_t *) &Task1_Task_Handler );
xTaskCreate( (TaskFunction_t) List_Task,
(char *) "List_Task",
(configSTACK_DEPTH_TYPE) List_Task_Size,
(void *) NULL,
(UBaseType_t) List_Task_Prio,
(TaskHandle_t *) &List_Task_Handler );
vTaskDelete(Start_Task_Handler);
}
void Task1_Task(void *pvParamaters)
{
uint8_t task1_num = 0;
while(1)
{
task1_num++;
vTaskDelay(1000);
//printf("Task1 is running %d\r\n",task1_num);
}
}
void List_Task(void *pvParamaters)
{
vListInitialise(&TestList);
vListInitialiseItem(&ListItem1);
vListInitialiseItem(&ListItem2);
vListInitialiseItem(&ListItem3);
ListItem1.xItemValue = 40;
ListItem2.xItemValue = 60;
ListItem3.xItemValue = 50;
printf("*******************************列表与列表项*******************************\r\n");
printf("项目-------------------------------地址---------------------------------\r\n");
printf("TestList---------------------------%#x----------------------------------\r\n",(int)&TestList);
printf("TestList->pxIndex------------------%#x----------------------------------\r\n",(int)TestList.pxIndex);
printf("TestList->xListEnd-----------------%#x----------------------------------\r\n",(int)&TestList.xListEnd);
printf("TestList->xListEnd->pxNext---------%#x----------------------------------\r\n",(int)TestList.xListEnd.pxNext);
printf("TestList->xListEnd->pxPrevious-----%#x----------------------------------\r\n",(int)TestList.xListEnd.pxPrevious);
printf("ListItem1--------------------------%#x----------------------------------\r\n",(int)&ListItem1);
printf("ListItem2--------------------------%#x----------------------------------\r\n",(int)&ListItem2);
printf("ListItem3--------------------------%#x----------------------------------\r\n",(int)&ListItem3);
printf("\r\n");
vListInsert(&TestList,&ListItem1);
printf("*****************************ListItem1_Insert***************************\r\n");
printf("项目-------------------------------地址---------------------------------\r\n");
printf("TestList---------------------------%#x----------------------------------\r\n",(int)&TestList);
printf("TestList->xListEnd-----------------%#x----------------------------------\r\n",(int)&TestList.xListEnd);
printf("TestList->xListEnd->pxNext---------%#x----------------------------------\r\n",(int)TestList.xListEnd.pxNext);
printf("TestList->xListEnd->pxPrevious-----%#x----------------------------------\r\n",(int)TestList.xListEnd.pxPrevious);
printf("ListItem1--------------------------%#x----------------------------------\r\n",(int)&ListItem1);
printf("ListItem1.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem1.pxNext);
printf("ListItem1.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem1.pxPrevious);
printf("\r\n");
vListInsert(&TestList,&ListItem2);
printf("*****************************ListItem2_Insert***************************\r\n");
printf("项目-------------------------------地址---------------------------------\r\n");
printf("TestList---------------------------%#x----------------------------------\r\n",(int)&TestList);
printf("TestList->xListEnd-----------------%#x----------------------------------\r\n",(int)&TestList.xListEnd);
printf("TestList->xListEnd->pxNext---------%#x----------------------------------\r\n",(int)TestList.xListEnd.pxNext);
printf("TestList->xListEnd->pxPrevious-----%#x----------------------------------\r\n",(int)TestList.xListEnd.pxPrevious);
printf("ListItem1.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem1.pxNext);
printf("ListItem1.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem1.pxPrevious);
printf("ListItem2.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem2.pxNext);
printf("ListItem2.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem2.pxPrevious);
printf("\r\n");
vListInsert(&TestList,&ListItem3);
printf("****************************ListItem3_Insert*****************************\r\n");
printf("项目-------------------------------地址---------------------------------\r\n");
printf("TestList---------------------------%#x----------------------------------\r\n",(int)&TestList);
printf("TestList->xListEnd-----------------%#x----------------------------------\r\n",(int)&TestList.xListEnd);
printf("TestList->xListEnd->pxNext---------%#x----------------------------------\r\n",(int)TestList.xListEnd.pxNext);
printf("TestList->xListEnd->pxPrevious-----%#x----------------------------------\r\n",(int)TestList.xListEnd.pxPrevious);
printf("ListItem3.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem3.pxNext);
printf("ListItem3.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem3.pxPrevious);
printf("ListItem1.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem1.pxNext);
printf("ListItem1.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem1.pxPrevious);
printf("ListItem2.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem2.pxNext);
printf("ListItem2.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem2.pxPrevious);
printf("\r\n");
uxListRemove(&ListItem3);
printf("****************************ListItem3_Delete*****************************\r\n");
printf("项目-------------------------------地址---------------------------------\r\n");
printf("TestList---------------------------%#x----------------------------------\r\n",(int)&TestList);
printf("TestList->xListEnd-----------------%#x----------------------------------\r\n",(int)&TestList.xListEnd);
printf("TestList->xListEnd->pxNext---------%#x----------------------------------\r\n",(int)TestList.xListEnd.pxNext);
printf("TestList->xListEnd->pxPrevious-----%#x----------------------------------\r\n",(int)TestList.xListEnd.pxPrevious);
printf("ListItem1.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem1.pxNext);
printf("ListItem1.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem1.pxPrevious);
printf("ListItem2.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem2.pxNext);
printf("ListItem2.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem2.pxPrevious);
printf("\r\n");
vListInsertEnd(&TestList,&ListItem3);
printf("****************************ListItem3_InsertEnd*****************************\r\n");
printf("项目-------------------------------地址---------------------------------\r\n");
printf("TestList---------------------------%#x----------------------------------\r\n",(int)&TestList);
printf("TestList->xListEnd-----------------%#x----------------------------------\r\n",(int)&TestList.xListEnd);
printf("TestList->xListEnd->pxNext---------%#x----------------------------------\r\n",(int)TestList.xListEnd.pxNext);
printf("TestList->xListEnd->pxPrevious-----%#x----------------------------------\r\n",(int)TestList.xListEnd.pxPrevious);
printf("ListItem3.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem3.pxNext);
printf("ListItem3.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem3.pxPrevious);
printf("ListItem1.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem1.pxNext);
printf("ListItem1.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem1.pxPrevious);
printf("ListItem2.pxNext-------------------%#x----------------------------------\r\n",(int)ListItem2.pxNext);
printf("ListItem2.pxPrevious---------------%#x----------------------------------\r\n",(int)ListItem2.pxPrevious);
while(1);
}
cs
*******************************列表与列表项*******************************
项目-------------------------------地址---------------------------------
TestList---------------------------0x200000c0----------------------------------
TestList->pxIndex------------------0x200000c8----------------------------------
TestList->xListEnd-----------------0x200000c8----------------------------------
TestList->xListEnd->pxNext---------0x200000c8----------------------------------
TestList->xListEnd->pxPrevious-----0x200000c8----------------------------------
ListItem1--------------------------0x200000d4----------------------------------
ListItem2--------------------------0x200000e8----------------------------------
ListItem3--------------------------0x200000fc----------------------------------
*****************************ListItem1_Insert***************************
项目-------------------------------地址---------------------------------
TestList---------------------------0x200000c0----------------------------------
TestList->xListEnd-----------------0x200000c8----------------------------------
TestList->xListEnd->pxNext---------0x200000d4----------------------------------
TestList->xListEnd->pxPrevious-----0x200000d4----------------------------------
ListItem1--------------------------0x200000d4----------------------------------
ListItem1.pxNext-------------------0x200000c8----------------------------------
ListItem1.pxPrevious---------------0x200000c8----------------------------------
*****************************ListItem2_Insert***************************
项目-------------------------------地址---------------------------------
TestList---------------------------0x200000c0----------------------------------
TestList->xListEnd-----------------0x200000c8----------------------------------
TestList->xListEnd->pxNext---------0x200000d4----------------------------------
TestList->xListEnd->pxPrevious-----0x200000e8----------------------------------
ListItem1.pxNext-------------------0x200000e8----------------------------------
ListItem1.pxPrevious---------------0x200000c8----------------------------------
ListItem2.pxNext-------------------0x200000c8----------------------------------
ListItem2.pxPrevious---------------0x200000d4----------------------------------
****************************ListItem3_Insert*****************************
项目-------------------------------地址---------------------------------
TestList---------------------------0x200000c0----------------------------------
TestList->xListEnd-----------------0x200000c8----------------------------------
TestList->xListEnd->pxNext---------0x200000d4----------------------------------
TestList->xListEnd->pxPrevious-----0x200000e8----------------------------------
ListItem3.pxNext-------------------0x200000e8----------------------------------
ListItem3.pxPrevious---------------0x200000d4----------------------------------
ListItem1.pxNext-------------------0x200000fc----------------------------------
ListItem1.pxPrevious---------------0x200000c8----------------------------------
ListItem2.pxNext-------------------0x200000c8----------------------------------
ListItem2.pxPrevious---------------0x200000fc----------------------------------
****************************ListItem3_Delete*****************************
项目-------------------------------地址---------------------------------
TestList---------------------------0x200000c0----------------------------------
TestList->xListEnd-----------------0x200000c8----------------------------------
TestList->xListEnd->pxNext---------0x200000d4----------------------------------
TestList->xListEnd->pxPrevious-----0x200000e8----------------------------------
ListItem1.pxNext-------------------0x200000e8----------------------------------
ListItem1.pxPrevious---------------0x200000c8----------------------------------
ListItem2.pxNext-------------------0x200000c8----------------------------------
ListItem2.pxPrevious---------------0x200000d4----------------------------------
****************************ListItem3_InsertEnd*****************************
项目-------------------------------地址---------------------------------
TestList---------------------------0x200000c0----------------------------------
TestList->xListEnd-----------------0x200000c8----------------------------------
TestList->xListEnd->pxNext---------0x200000d4----------------------------------
TestList->xListEnd->pxPrevious-----0x200000fc----------------------------------
ListItem3.pxNext-------------------0x200000c8----------------------------------
ListItem3.pxPrevious---------------0x200000e8----------------------------------
ListItem1.pxNext-------------------0x200000e8----------------------------------
ListItem1.pxPrevious---------------0x200000c8----------------------------------
ListItem2.pxNext-------------------0x200000fc----------------------------------
ListItem2.pxPrevious---------------0x200000d4----------------------------------