STM32-FreeRTOS列表插入和删除实验
STM32—FreeRTOS列表插入和删除实验
一、实验
实验目的: 学会对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
实验解析: