FreeRTOS之列表及列表项实验(基于stm32f103c8t6)

2023-12-21 23:27:05

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;//定义测试列表项3

int 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();//进入临界区,创建任务完成后,才开始执行优先级任务
        //创建Task1
		xTaskCreate((TaskFunction_t ) task1_task,
								(char *   			) "task1_task",
								(uint16_t 			) TASK1_STK_SIZE,
								(void *         	) NULL,
								(UBaseType_t    	) TASK1_TASK_PRIO,
								(TaskHandle_t * 	) &Task1Task_Handler);
        //创建Task2
		xTaskCreate((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);//删除开始任务,删除自身用NULL
		taskEXIT_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");	
	
	    //插入列表项1
		printf("**********************************\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);
		}
}


?串口信息:

?

文章来源:https://blog.csdn.net/m0_67069564/article/details/135141369
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。