STM32---FreeRTOS列表插入和删除实验

发布于:2025-03-06 ⋅ 阅读:(12) ⋅ 点赞:(0)

一、实验

实验目的:学会对FreeRTOS列表和列表项的操作函数使用,并观察运行结构和理论分析是否一致

实验设计:将设计三个任务:start_task、task1、task2

三个任务功能如下:

        start_task:用来创建其他的2个任务

        task1:实现LED0每500ms闪烁一次,用来提示系统正在运行

        task2:调佣列表和列表项相关的API函数,并且通过串口输出相应的信息,进行观察

 二、代码及实验解析:

main.c

#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "freertos_demo.h"
#include "Delay.h"
#include "sys.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"
#include "led.h"

 int main(void)
 {	
	 
	 uart_init(115200);
	 delay_init();
	 LED_Init();
	 
	    // 创建任务
   FrrrRTOS_Demo(); 	  
}


1.插入列表项1

freertos_demo.c

#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"
#include "led.h"

/******************************************************************任务配置****************************************************/
//包括:任务句柄、任务优先级、任务大小、创建任务
//任务优先级
#define START_TASK_PRIO					1
//任务堆栈大小	
#define START_TASK_STACK_SIZE 	128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO							2
//任务堆栈大小	
#define TASK1_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
 
 
 //任务优先级
#define TASK2_PRIO							3
//任务堆栈大小	
#define TASK2_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);

List_t				TestList;				/*定义测试列表*/
ListItem_t		ListItem_t1;		/*定义测试列表项1*/
ListItem_t		ListItem_t2;		/*定义测试列表项2*/
ListItem_t		ListItem_t3;		/*定义测试列表项3*/

/******************************************************************任务函数****************************************************/
void FrrrRTOS_Demo(void)
{

			 //创建开始任务
		xTaskCreate((TaskFunction_t )start_task,            			//任务函数
                ( char*         )"start_task",          			//任务名称
                (uint16_t       )START_TASK_STACK_SIZE, 			//任务堆栈大小
                (void*          )NULL,                  			//传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       			//任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   			//任务句柄 
	  // 启动任务调度
		vTaskStartScheduler();
}




 void start_task(void *pvParameters)
{
	 taskENTER_CRITICAL();          									 //进入临界区
    //创建任务1
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler); 
     //创建任务2
    xTaskCreate((TaskFunction_t )task2,     	
                (const char*    )"task2",   	
                (uint16_t       )TASK2_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK2_PRIO,	
                (TaskHandle_t*  )&Task2_Handler); 		
								
    vTaskDelete(StartTask_Handler); 									//删除开始任务
    taskEXIT_CRITICAL();            									//退出临界区
}

// 任务1函数:LED0翻转函数
void task1(void *pvParameters)
{

	while(1)
  {
		LED1_Turn();
		vTaskDelay(1000);
  }
}
// 任务2函数:列表项插入和删除实验
void task2(void *pvParameters)
{
	vListInitialise(&TestList) ;					/*初始化列表*/
	vListInitialiseItem(&ListItem_t1);		/*初始化列表项1*/
	vListInitialiseItem(&ListItem_t2);		/*初始化列表项2*/
	vListInitialiseItem(&ListItem_t3);		/*初始化列表项3*/
	
	ListItem_t1.xItemValue = 40;
	ListItem_t2.xItemValue = 60;
	ListItem_t3.xItemValue = 50;
	
	/* 第二步:打印列表和其他列表项的地址 */
	printf("/**************第二步:打印列表和列表项的地址**************/\r\n");
	printf("项目\t\t\t地址\r\n");
	printf("TestList\t\t0x%p\t\r\n", &TestList);
	printf("TestList->pxIndex\t0x%p\t\r\n", TestList.pxIndex);
	printf("TestList->xListEnd\t0x%p\t\r\n", (&TestList.xListEnd));
	printf("ListItem1\t\t0x%p\t\r\n", &ListItem_t1);
	printf("ListItem2\t\t0x%p\t\r\n", &ListItem_t2);
	printf("ListItem3\t\t0x%p\t\r\n", &ListItem_t3);
	printf("/**************************结束***************************/\r\n");
	
	printf("\r\n/*****************第三步:列表项1插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t1);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("/**************************结束***************************/\r\n");


	while(1)
  {

		vTaskDelay(1000);
  }
}


实验解析: 

 2.插入列表项2

freertos_demo.c

#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"
#include "led.h"

/******************************************************************任务配置****************************************************/
//包括:任务句柄、任务优先级、任务大小、创建任务
//任务优先级
#define START_TASK_PRIO					1
//任务堆栈大小	
#define START_TASK_STACK_SIZE 	128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO							2
//任务堆栈大小	
#define TASK1_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
 
 
 //任务优先级
#define TASK2_PRIO							3
//任务堆栈大小	
#define TASK2_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);

List_t				TestList;				/*定义测试列表*/
ListItem_t		ListItem_t1;		/*定义测试列表项1*/
ListItem_t		ListItem_t2;		/*定义测试列表项2*/
ListItem_t		ListItem_t3;		/*定义测试列表项3*/

/******************************************************************任务函数****************************************************/
void FrrrRTOS_Demo(void)
{

			 //创建开始任务
		xTaskCreate((TaskFunction_t )start_task,            			//任务函数
                ( char*         )"start_task",          			//任务名称
                (uint16_t       )START_TASK_STACK_SIZE, 			//任务堆栈大小
                (void*          )NULL,                  			//传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       			//任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   			//任务句柄 
	  // 启动任务调度
		vTaskStartScheduler();
}




 void start_task(void *pvParameters)
{
	 taskENTER_CRITICAL();          									 //进入临界区
    //创建任务1
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler); 
     //创建任务2
    xTaskCreate((TaskFunction_t )task2,     	
                (const char*    )"task2",   	
                (uint16_t       )TASK2_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK2_PRIO,	
                (TaskHandle_t*  )&Task2_Handler); 		
								
    vTaskDelete(StartTask_Handler); 									//删除开始任务
    taskEXIT_CRITICAL();            									//退出临界区
}

// 任务1函数:LED0翻转函数
void task1(void *pvParameters)
{

	while(1)
  {
		LED1_Turn();
		vTaskDelay(1000);
  }
}
// 任务2函数:列表项插入和删除实验
void task2(void *pvParameters)
{
	vListInitialise(&TestList) ;					/*初始化列表*/
	vListInitialiseItem(&ListItem_t1);		/*初始化列表项1*/
	vListInitialiseItem(&ListItem_t2);		/*初始化列表项2*/
	vListInitialiseItem(&ListItem_t3);		/*初始化列表项3*/
	
	ListItem_t1.xItemValue = 40;
	ListItem_t2.xItemValue = 60;
	ListItem_t3.xItemValue = 50;
	
	/* 第二步:打印列表和其他列表项的地址 */
	printf("/**************第二步:打印列表和列表项的地址**************/\r\n");
	printf("项目\t\t\t地址\r\n");
	printf("TestList\t\t0x%p\t\r\n", &TestList);
	printf("TestList->pxIndex\t0x%p\t\r\n", TestList.pxIndex);
	printf("TestList->xListEnd\t0x%p\t\r\n", (&TestList.xListEnd));
	printf("ListItem1\t\t0x%p\t\r\n", &ListItem_t1);
	printf("ListItem2\t\t0x%p\t\r\n", &ListItem_t2);
	printf("ListItem3\t\t0x%p\t\r\n", &ListItem_t3);
	printf("/**************************结束***************************/\r\n");
	
	printf("\r\n/*****************第三步:列表项1插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t1);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第四步:列表项2插入列表 */
	printf("\r\n/*****************第四步:列表项2插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t2);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("/**************************结束***************************/\r\n");


	while(1)
  {

		vTaskDelay(1000);
  }
}


实验解析: 

3.插入列表项3 

#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"
#include "led.h"

/******************************************************************任务配置****************************************************/
//包括:任务句柄、任务优先级、任务大小、创建任务
//任务优先级
#define START_TASK_PRIO					1
//任务堆栈大小	
#define START_TASK_STACK_SIZE 	128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO							2
//任务堆栈大小	
#define TASK1_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
 
 
 //任务优先级
#define TASK2_PRIO							3
//任务堆栈大小	
#define TASK2_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);

List_t				TestList;				/*定义测试列表*/
ListItem_t		ListItem_t1;		/*定义测试列表项1*/
ListItem_t		ListItem_t2;		/*定义测试列表项2*/
ListItem_t		ListItem_t3;		/*定义测试列表项3*/

/******************************************************************任务函数****************************************************/
void FrrrRTOS_Demo(void)
{

			 //创建开始任务
		xTaskCreate((TaskFunction_t )start_task,            			//任务函数
                ( char*         )"start_task",          			//任务名称
                (uint16_t       )START_TASK_STACK_SIZE, 			//任务堆栈大小
                (void*          )NULL,                  			//传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       			//任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   			//任务句柄 
	  // 启动任务调度
		vTaskStartScheduler();
}




 void start_task(void *pvParameters)
{
	 taskENTER_CRITICAL();          									 //进入临界区
    //创建任务1
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler); 
     //创建任务2
    xTaskCreate((TaskFunction_t )task2,     	
                (const char*    )"task2",   	
                (uint16_t       )TASK2_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK2_PRIO,	
                (TaskHandle_t*  )&Task2_Handler); 		
								
    vTaskDelete(StartTask_Handler); 									//删除开始任务
    taskEXIT_CRITICAL();            									//退出临界区
}

// 任务1函数:LED0翻转函数
void task1(void *pvParameters)
{

	while(1)
  {
		LED1_Turn();
		vTaskDelay(1000);
  }
}
// 任务2函数:列表项插入和删除实验
void task2(void *pvParameters)
{
	vListInitialise(&TestList) ;					/*初始化列表*/
	vListInitialiseItem(&ListItem_t1);		/*初始化列表项1*/
	vListInitialiseItem(&ListItem_t2);		/*初始化列表项2*/
	vListInitialiseItem(&ListItem_t3);		/*初始化列表项3*/
	
	ListItem_t1.xItemValue = 40;
	ListItem_t2.xItemValue = 60;
	ListItem_t3.xItemValue = 50;
	
	/* 第二步:打印列表和其他列表项的地址 */
	printf("/**************第二步:打印列表和列表项的地址**************/\r\n");
	printf("项目\t\t\t地址\r\n");
	printf("TestList\t\t0x%p\t\r\n", &TestList);
	printf("TestList->pxIndex\t0x%p\t\r\n", TestList.pxIndex);
	printf("TestList->xListEnd\t0x%p\t\r\n", (&TestList.xListEnd));
	printf("ListItem1\t\t0x%p\t\r\n", &ListItem_t1);
	printf("ListItem2\t\t0x%p\t\r\n", &ListItem_t2);
	printf("ListItem3\t\t0x%p\t\r\n", &ListItem_t3);
	printf("/**************************结束***************************/\r\n");
	
	printf("\r\n/*****************第三步:列表项1插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t1);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第四步:列表项2插入列表 */
	printf("\r\n/*****************第四步:列表项2插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t2);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("/**************************结束***************************/\r\n");
//	
	/* 第五步:列表项3插入列表 */
	printf("\r\n/*****************第五步:列表项3插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t3);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/**************************结束***************************/\r\n");


	while(1)
  {

		vTaskDelay(1000);
  }
}


实验解析:

void vListInsert( List_t * const pxList,

ListItem_t * const pxNewListItem )                        //升序排列插入

    ListItem_t1.xItemValue = 40;
    ListItem_t2.xItemValue = 60;
    ListItem_t3.xItemValue = 50;

4.移除列表项2

#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"
#include "led.h"

/******************************************************************任务配置****************************************************/
//包括:任务句柄、任务优先级、任务大小、创建任务
//任务优先级
#define START_TASK_PRIO					1
//任务堆栈大小	
#define START_TASK_STACK_SIZE 	128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO							2
//任务堆栈大小	
#define TASK1_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
 
 
 //任务优先级
#define TASK2_PRIO							3
//任务堆栈大小	
#define TASK2_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);

List_t				TestList;				/*定义测试列表*/
ListItem_t		ListItem_t1;		/*定义测试列表项1*/
ListItem_t		ListItem_t2;		/*定义测试列表项2*/
ListItem_t		ListItem_t3;		/*定义测试列表项3*/

/******************************************************************任务函数****************************************************/
void FrrrRTOS_Demo(void)
{

			 //创建开始任务
		xTaskCreate((TaskFunction_t )start_task,            			//任务函数
                ( char*         )"start_task",          			//任务名称
                (uint16_t       )START_TASK_STACK_SIZE, 			//任务堆栈大小
                (void*          )NULL,                  			//传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       			//任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   			//任务句柄 
	  // 启动任务调度
		vTaskStartScheduler();
}




 void start_task(void *pvParameters)
{
	 taskENTER_CRITICAL();          									 //进入临界区
    //创建任务1
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler); 
     //创建任务2
    xTaskCreate((TaskFunction_t )task2,     	
                (const char*    )"task2",   	
                (uint16_t       )TASK2_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK2_PRIO,	
                (TaskHandle_t*  )&Task2_Handler); 		
								
    vTaskDelete(StartTask_Handler); 									//删除开始任务
    taskEXIT_CRITICAL();            									//退出临界区
}

// 任务1函数:LED0翻转函数
void task1(void *pvParameters)
{

	while(1)
  {
		LED1_Turn();
		vTaskDelay(1000);
  }
}
// 任务2函数:列表项插入和删除实验
void task2(void *pvParameters)
{
	vListInitialise(&TestList) ;					/*初始化列表*/
	vListInitialiseItem(&ListItem_t1);		/*初始化列表项1*/
	vListInitialiseItem(&ListItem_t2);		/*初始化列表项2*/
	vListInitialiseItem(&ListItem_t3);		/*初始化列表项3*/
	
	ListItem_t1.xItemValue = 40;
	ListItem_t2.xItemValue = 60;
	ListItem_t3.xItemValue = 50;
	
	/* 第二步:打印列表和其他列表项的地址 */
	printf("/**************第二步:打印列表和列表项的地址**************/\r\n");
	printf("项目\t\t\t地址\r\n");
	printf("TestList\t\t0x%p\t\r\n", &TestList);
	printf("TestList->pxIndex\t0x%p\t\r\n", TestList.pxIndex);
	printf("TestList->xListEnd\t0x%p\t\r\n", (&TestList.xListEnd));
	printf("ListItem1\t\t0x%p\t\r\n", &ListItem_t1);
	printf("ListItem2\t\t0x%p\t\r\n", &ListItem_t2);
	printf("ListItem3\t\t0x%p\t\r\n", &ListItem_t3);
	printf("/**************************结束***************************/\r\n");
	
	printf("\r\n/*****************第三步:列表项1插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t1);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第四步:列表项2插入列表 */
	printf("\r\n/*****************第四步:列表项2插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t2);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("/**************************结束***************************/\r\n");
//	
	/* 第五步:列表项3插入列表 */
	printf("\r\n/*****************第五步:列表项3插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t3);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第六步:移除列表项2 */
	printf("\r\n/*******************第六步:移除列表项2********************/\r\n");
	uxListRemove((ListItem_t*   )&ListItem_t3);   /* 移除列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/**************************结束***************************/\r\n");

	while(1)
  {

		vTaskDelay(1000);
  }
}


实验解析: 

5.在列表末尾插入列表项 

#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"
#include "led.h"

/******************************************************************任务配置****************************************************/
//包括:任务句柄、任务优先级、任务大小、创建任务
//任务优先级
#define START_TASK_PRIO					1
//任务堆栈大小	
#define START_TASK_STACK_SIZE 	128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO							2
//任务堆栈大小	
#define TASK1_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
 
 
 //任务优先级
#define TASK2_PRIO							3
//任务堆栈大小	
#define TASK2_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);

List_t				TestList;				/*定义测试列表*/
ListItem_t		ListItem_t1;		/*定义测试列表项1*/
ListItem_t		ListItem_t2;		/*定义测试列表项2*/
ListItem_t		ListItem_t3;		/*定义测试列表项3*/

/******************************************************************任务函数****************************************************/
void FrrrRTOS_Demo(void)
{

			 //创建开始任务
		xTaskCreate((TaskFunction_t )start_task,            			//任务函数
                ( char*         )"start_task",          			//任务名称
                (uint16_t       )START_TASK_STACK_SIZE, 			//任务堆栈大小
                (void*          )NULL,                  			//传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       			//任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   			//任务句柄 
	  // 启动任务调度
		vTaskStartScheduler();
}




 void start_task(void *pvParameters)
{
	 taskENTER_CRITICAL();          									 //进入临界区
    //创建任务1
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler); 
     //创建任务2
    xTaskCreate((TaskFunction_t )task2,     	
                (const char*    )"task2",   	
                (uint16_t       )TASK2_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK2_PRIO,	
                (TaskHandle_t*  )&Task2_Handler); 		
								
    vTaskDelete(StartTask_Handler); 									//删除开始任务
    taskEXIT_CRITICAL();            									//退出临界区
}

// 任务1函数:LED0翻转函数
void task1(void *pvParameters)
{

	while(1)
  {
		LED1_Turn();
		vTaskDelay(1000);
  }
}
// 任务2函数:列表项插入和删除实验
void task2(void *pvParameters)
{
	vListInitialise(&TestList) ;					/*初始化列表*/
	vListInitialiseItem(&ListItem_t1);		/*初始化列表项1*/
	vListInitialiseItem(&ListItem_t2);		/*初始化列表项2*/
	vListInitialiseItem(&ListItem_t3);		/*初始化列表项3*/
	
	ListItem_t1.xItemValue = 40;
	ListItem_t2.xItemValue = 60;
	ListItem_t3.xItemValue = 50;
	
	/* 第二步:打印列表和其他列表项的地址 */
	printf("/**************第二步:打印列表和列表项的地址**************/\r\n");
	printf("项目\t\t\t地址\r\n");
	printf("TestList\t\t0x%p\t\r\n", &TestList);
	printf("TestList->pxIndex\t0x%p\t\r\n", TestList.pxIndex);
	printf("TestList->xListEnd\t0x%p\t\r\n", (&TestList.xListEnd));
	printf("ListItem1\t\t0x%p\t\r\n", &ListItem_t1);
	printf("ListItem2\t\t0x%p\t\r\n", &ListItem_t2);
	printf("ListItem3\t\t0x%p\t\r\n", &ListItem_t3);
	printf("/**************************结束***************************/\r\n");
	
	printf("\r\n/*****************第三步:列表项1插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t1);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第四步:列表项2插入列表 */
	printf("\r\n/*****************第四步:列表项2插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t2);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("/**************************结束***************************/\r\n");
//	
	/* 第五步:列表项3插入列表 */
	printf("\r\n/*****************第五步:列表项3插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t3);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第六步:移除列表项2 */
	printf("\r\n/*******************第六步:移除列表项2********************/\r\n");
	uxListRemove((ListItem_t*   )&ListItem_t2);   /* 移除列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第七步:列表末尾添加列表项2 */
	printf("\r\n/****************第七步:列表末尾添加列表项2****************/\r\n");
	vListInsertEnd((List_t*     )&TestList,     /* 列表 */
								 (ListItem_t* )&ListItem_t2);   /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/************************实验结束***************************/\r\n");

	while(1)
  {

		vTaskDelay(1000);
  }
}


实验解析:

6.在列表项1前插入

#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"
#include "led.h"

/******************************************************************任务配置****************************************************/
//包括:任务句柄、任务优先级、任务大小、创建任务
//任务优先级
#define START_TASK_PRIO					1
//任务堆栈大小	
#define START_TASK_STACK_SIZE 	128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);


//任务优先级
#define TASK1_PRIO							2
//任务堆栈大小	
#define TASK1_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
 
 
 //任务优先级
#define TASK2_PRIO							3
//任务堆栈大小	
#define TASK2_STACK_SIZE 				128  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);

List_t				TestList;				/*定义测试列表*/
ListItem_t		ListItem_t1;		/*定义测试列表项1*/
ListItem_t		ListItem_t2;		/*定义测试列表项2*/
ListItem_t		ListItem_t3;		/*定义测试列表项3*/

/******************************************************************任务函数****************************************************/
void FrrrRTOS_Demo(void)
{

			 //创建开始任务
		xTaskCreate((TaskFunction_t )start_task,            			//任务函数
                ( char*         )"start_task",          			//任务名称
                (uint16_t       )START_TASK_STACK_SIZE, 			//任务堆栈大小
                (void*          )NULL,                  			//传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       			//任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   			//任务句柄 
	  // 启动任务调度
		vTaskStartScheduler();
}




 void start_task(void *pvParameters)
{
	 taskENTER_CRITICAL();          									 //进入临界区
    //创建任务1
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler); 
     //创建任务2
    xTaskCreate((TaskFunction_t )task2,     	
                (const char*    )"task2",   	
                (uint16_t       )TASK2_STACK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK2_PRIO,	
                (TaskHandle_t*  )&Task2_Handler); 		
								
    vTaskDelete(StartTask_Handler); 									//删除开始任务
    taskEXIT_CRITICAL();            									//退出临界区
}

// 任务1函数:LED0翻转函数
void task1(void *pvParameters)
{

	while(1)
  {
		LED1_Turn();
		vTaskDelay(1000);
  }
}
// 任务2函数:列表项插入和删除实验
void task2(void *pvParameters)
{
	vListInitialise(&TestList) ;					/*初始化列表*/
	vListInitialiseItem(&ListItem_t1);		/*初始化列表项1*/
	vListInitialiseItem(&ListItem_t2);		/*初始化列表项2*/
	vListInitialiseItem(&ListItem_t3);		/*初始化列表项3*/
	
	ListItem_t1.xItemValue = 40;
	ListItem_t2.xItemValue = 60;
	ListItem_t3.xItemValue = 50;
	
	/* 第二步:打印列表和其他列表项的地址 */
	printf("/**************第二步:打印列表和列表项的地址**************/\r\n");
	printf("项目\t\t\t地址\r\n");
	printf("TestList\t\t0x%p\t\r\n", &TestList);
	printf("TestList->pxIndex\t0x%p\t\r\n", TestList.pxIndex);
	printf("TestList->xListEnd\t0x%p\t\r\n", (&TestList.xListEnd));
	printf("ListItem1\t\t0x%p\t\r\n", &ListItem_t1);
	printf("ListItem2\t\t0x%p\t\r\n", &ListItem_t2);
	printf("ListItem3\t\t0x%p\t\r\n", &ListItem_t3);
	printf("/**************************结束***************************/\r\n");
	
	printf("\r\n/*****************第三步:列表项1插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t1);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第四步:列表项2插入列表 */
	printf("\r\n/*****************第四步:列表项2插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t2);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("/**************************结束***************************/\r\n");
//	
	/* 第五步:列表项3插入列表 */
	printf("\r\n/*****************第五步:列表项3插入列表******************/\r\n");
	vListInsert((List_t*    )&TestList,         /* 列表 */
							(ListItem_t*)&ListItem_t3);       /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第六步:移除列表项2 */
	printf("\r\n/*******************第六步:移除列表项2********************/\r\n");
	uxListRemove((ListItem_t*   )&ListItem_t2);   /* 移除列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/**************************结束***************************/\r\n");
	
	/* 第七步:列表末尾添加列表项2 */
	printf("\r\n/****************第七步:列表末尾添加列表项2****************/\r\n");
	TestList.pxIndex = &ListItem_t1;
	vListInsertEnd((List_t*     )&TestList,     /* 列表 */
								 (ListItem_t* )&ListItem_t2);   /* 列表项 */
	printf("项目\t\t\t\t地址\r\n");
	printf("TestList->pxIndex\t\t0x%p\r\n", TestList.pxIndex);
	printf("TestList->xListEnd->pxNext\t0x%p\r\n", (TestList.xListEnd.pxNext));
	printf("ListItem1->pxNext\t\t0x%p\r\n", (ListItem_t1.pxNext));
	printf("ListItem2->pxNext\t\t0x%p\r\n", (ListItem_t2.pxNext));
	printf("ListItem3->pxNext\t\t0x%p\r\n", (ListItem_t3.pxNext));
	printf("TestList->xListEnd->pxPrevious\t0x%p\r\n", (TestList.xListEnd.pxPrevious));
	printf("ListItem1->pxPrevious\t\t0x%p\r\n", (ListItem_t1.pxPrevious));
	printf("ListItem2->pxPrevious\t\t0x%p\r\n", (ListItem_t2.pxPrevious));
	printf("ListItem3->pxPrevious\t\t0x%p\r\n", (ListItem_t3.pxPrevious));
	printf("/************************实验结束***************************/\r\n");

	while(1)
  {

		vTaskDelay(1000);
  }
}


 TestList.pxIndex = &ListItem_t1;               //将 TestList 中的 pxIndex 指针指向 ListItem_t1

 实验解析:

三、重点 


网站公告

今日签到

点亮在社区的每一天
去签到