一、实验
实验目的:学会对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