stm32_16:列表

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----------------------------------
相关推荐
一路往蓝-Anbo2 小时前
【第48期】:嵌入式工程师的自我修养与进阶之路
开发语言·网络·stm32·单片机·嵌入式硬件
破晓单片机2 小时前
STM32单片机分享:智能浇花系统
stm32·单片机·嵌入式硬件
llilian_162 小时前
gps对时扩展装置 抢险救灾中时间同步精确的重要性分析 电力系统同步时钟
网络·功能测试·单片机·嵌入式硬件
Y1rong2 小时前
STM32之看门狗
stm32·单片机·嵌入式硬件
az44yao3 小时前
windows api 创建mdi程序
windows·stm32·单片机
JERRY. LIU3 小时前
PV 光电(光伏技术)
单片机·嵌入式硬件
破晓单片机3 小时前
STM32单片机分享:智能洗碗机系统
stm32·单片机·嵌入式硬件
首席拯救HMI官3 小时前
【拯救HMI】AR技术与HMI融合:工业现场的可视化新范式
网络·stm32·单片机·网络协议·ar·设计规范
蓑衣客VS索尼克10 小时前
STM32G4针对串口通信异常的操作
stm32·单片机·嵌入式硬件