FreeRTOS之队列操作

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "sys.h"
#include "queue.h"
/****************************************************
STM32F103C8T6单片机freertos移植实验
作者:KJX
时间:2023-12-22
*****************************************************/
//优先级
#define START_TASK_PRIO         1
//堆栈大小
#define START_STK_SIZE        128
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;

//task1优先级
#define TASK1_TASK_PRIO      	3
//task1堆栈大小
#define TASK1_STK_SIZE        128
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t  Task1Task_Handler;

//task2优先级
#define TASK2_TASK_PRIO      	2
//task2堆栈大小
#define TASK2_STK_SIZE        128
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t  Task2Task_Handler;

//数据定义(队列操作)
QueueHandle_t key_queue;
QueueHandle_t bigData_queue;
char buff[100]={"我是大数组,不能超过100,okokok,20231222,kjx"};

int main(void)
{
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
		delay_init();
		uart_init(9600);
		LED_Init();
		LED0=0;	
        //创建队列
		key_queue = xQueueCreate(2,sizeof(uint8_t));
		if(key_queue!=NULL)
		{
		    printf("key_queue队列创建成功!\r\n");
		}
		else{
			printf("key_queue队列创建失败!\r\n");
		}
		 //创建队列
		bigData_queue = xQueueCreate(1,sizeof(char *));
		if(bigData_queue!=NULL)
		{
		    printf("bigData_queue队列创建成功!\r\n");
		}
		else{
			printf("bigData_queue队列创建失败!\r\n");
		}
		
		
		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();//退出临界区
}

//key_queue、bigData_queue入队
//任务一
void task1_task(void * pvParameters)
{
	uint8_t key=2;
	BaseType_t err=0;
	char *buf;
	buf=buff;
	while(1)
	 {
			if(key==1)
			{
			   err = xQueueSend(key_queue,&key,portMAX_DELAY);
               if(err!= pdTRUE)
			   {
			       printf("key_queue error\r\n");
			   }
			   
			}else if(key==2)
			{
			   err = xQueueSend(bigData_queue,&buf,portMAX_DELAY);
			   if(err!= pdTRUE)
			   {
			       printf("bigData_queue error\r\n");
			   }
			}
			vTaskDelay(10);
	 }
}

//任务二,key_queue或bigData_queue出队
void task2_task(void * pvParameters)
{   
	uint8_t key=0;
	BaseType_t err=0;
	char *buf;
	buf=buff;
//	while(1)
//	{
//	    err = xQueueReceive(key_queue,&key,portMAX_DELAY);
//		if(err!= pdTRUE)
//	    {
//			printf("key_queue读取失败\r\n");
//	    }
//		else{
//			printf("key_queue读取成功,%d\r\n",key);
//		}
//		vTaskDelay(1000);
//	}
	while(1)
	{
	    err = xQueueReceive(bigData_queue,&buf,portMAX_DELAY);
		if(err!= pdTRUE)
	    {
			printf("bigData_queue读取失败\r\n");
	    }
		else{
			printf("bigData_queue读取成功,%s\r\n",buf);
		}
		vTaskDelay(1000);
	}
}


 FreeRTOS之队列操作_第1张图片

你可能感兴趣的:(FreeRTOS,stm32)