多个任务在在同一队列中传递的同一种数据类型,而队列集能够在任务之间传递不同的数据类型。
配置流程:(更详细流程参考正点原子的教程)
1、启用队列集将configUSE_QUEUE_SETA置1)
2、创建队列集
3、创建队列或信号量
4、往队列集添加队列或信号量
5、往队列发送信息及信号量
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "sys.h"
#include "semphr.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;//相关信号量
QueueSetHandle_t queueset_handle;
QueueHandle_t    queue_handle;
QueueHandle_t    semphr_handle;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();//进入临界区,创建任务完成后,才开始执行优先级任务//队列集相关queueset_handle=xQueueCreateSet(2);//创建数列集,可存放2个队列if(queueset_handle!= NULL){printf("队列集创建成功!!\r\n");}queue_handle = xQueueCreate(1,sizeof(uint8_t));//创建队列semphr_handle = xSemaphoreCreateBinary();//创建二值信号量//加入队列集xQueueAddToSet(queue_handle,queueset_handle);xQueueAddToSet(semphr_handle,queueset_handle);//创建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)
{    uint8_t key=1;BaseType_t err;	while(1){if(key==1){	    err=xQueueSend(queue_handle,&key,portMAX_DELAY);if(err==pdPASS){printf("往队列写入数据成功!!\r\n");	}		}else if(key==2){err=xSemaphoreGive(semphr_handle);if(err==pdPASS){printf("释放信号量成功!!\r\n");	}}vTaskDelay(10);}
}//任务二,获取队列信息
void task2_task(void * pvParameters)
{   QueueSetMemberHandle_t  member_handle;uint8_t key;while(1){member_handle = xQueueSelectFromSet(queueset_handle,portMAX_DELAY);if(member_handle == queue_handle){xQueueReceive(member_handle,&key,portMAX_DELAY);printf("获取的队列数据为:%d\r\n",key);}else if(member_handle==semphr_handle ){xSemaphoreTake(member_handle,portMAX_DELAY);printf("获取信号量成功!!\r\n");}}
}