B站正点原子视频链接:
第23讲 列表项的插入和删除实验_哔哩哔哩_bilibili
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "sys.h"
/****************************************************
STM32F103C8T6单片机freertos移植实验
作者:KJX
时间:2023-12-21
*****************************************************/
//优先级
#define START_TASK_PRIO 1
//堆栈大小
#define START_STK_SIZE 120
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;//task1优先级
#define TASK1_TASK_PRIO 2
//task1堆栈大小
#define TASK1_STK_SIZE 120
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t Task1Task_Handler;//task2优先级
#define TASK2_TASK_PRIO 3
//task2堆栈大小
#define TASK2_STK_SIZE 120
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t Task2Task_Handler;//列表与列表项
List_t TestList; //定义测试列表
ListItem_t ListItem1;//定义测试列表项1
ListItem_t ListItem2;//定义测试列表项2
ListItem_t ListItem3;//定义测试列表项3int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);delay_init();uart_init(9600);LED_Init();LED0=0; xTaskCreate((TaskFunction_t ) start_task, //指向任务函数的指针,必须为第一个(char * ) "start_task", //任务名字(uint16_t ) START_STK_SIZE, //任务堆栈大小,字为单位(void * ) NULL, //传递给任务函数的参数(UBaseType_t ) START_TASK_PRIO,//任务优先级,数值大,则优先级大(TaskHandle_t * ) &StartTask_Handler);//任务句柄(控制块) vTaskStartScheduler();//开启任务调度
}//开始任务
//返回值为pdPASS则创建任务成功void start_task(void * pvParameters)
{taskENTER_CRITICAL();//进入临界区,创建任务完成后,才开始执行优先级任务//创建Task1xTaskCreate((TaskFunction_t ) task1_task,(char * ) "task1_task",(uint16_t ) TASK1_STK_SIZE,(void * ) NULL,(UBaseType_t ) TASK1_TASK_PRIO,(TaskHandle_t * ) &Task1Task_Handler);//创建Task2xTaskCreate((TaskFunction_t ) task2_task,(char * ) "task2_task",(uint16_t ) TASK2_STK_SIZE,(void * ) NULL,(UBaseType_t ) TASK2_TASK_PRIO,(TaskHandle_t * ) &Task2Task_Handler);vTaskDelete(StartTask_Handler);//删除开始任务,删除自身用NULLtaskEXIT_CRITICAL();//退出临界区
}//任务一
void task1_task(void * pvParameters)
{while(1){ //vTaskDelete(StartTask_Handler);printf("开始执行任务一\n\r");LED0=~LED0;vTaskDelay(1000);}}//任务二
void task2_task(void * pvParameters)
{ //初始化列表及列表项vListInitialise(&TestList);vListInitialiseItem(&ListItem1);vListInitialiseItem(&ListItem2);vListInitialiseItem(&ListItem3);ListItem1.xItemValue=40;ListItem2.xItemValue=60;ListItem3.xItemValue=50;//打印列表及列表项得地址printf("**********************************\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",&ListItem1);printf("ListItem2\t\t0x%p\t\r\n",&ListItem2);printf("ListItem3\t\t0x%p\t\r\n",&ListItem3);printf("**********************************\r\n"); //插入列表项1printf("**********************************\r\n");vListInsert((List_t*)&TestList,(ListItem_t*)&ListItem1);//将列表项1插入列表printf("TestList->xListEnd->pxNext\t0x%p\r\n",(TestList.xListEnd.pxNext));printf("ListItem1->pxNext\t\t0x%p\t\r\n",(ListItem1.pxNext));printf("TestList->xListEnd->pxPrevious\t0x%p\t\r\n",(TestList.xListEnd.pxPrevious));printf("ListItem1->pxPrevious\t\t0x%p\t\r\n",&(ListItem1.pxPrevious));while(1){printf("开始执行任务二\n\r");LED1=0;vTaskDelay(1000);LED1=1;vTaskDelay(1000);}
}
串口信息: