一、概念
队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断与任务间传递信息,实现了任务接收来自于其他任务或中断的不定长度信息
二、常用函数
(1)xQueueCreate创建队列
(2)vQueueDelete删除队列,删除后所有消息都会被回收不能再使用
(3)xQueueSend、xQueueSendToBack、xQueueOverwrite从队列尾部入队
(4)xQueueSendToFront从队列首部入队
(5)xQueueSendFromISR、xQueueSendToBackFromISR、xQueueOverwriteFromISR从队列尾部入队(带中断保护)
(6)xQueueSendToFrontFromISR从队列首部入队(带中断保护)
(7)xQueueReceive出队并删除队列项
(8)xQueuePeek出队不删除队列项
(9)xQueueReceiveFromISR出队并删除队列项(带中断保护)
(10)xQueuePeekFromISR出队不删除队列项(带中断保护)
三、代码示例
#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#include "queue.h"static void vAppInitTask(void* pParam);
static void task1(void* pParam);
static void task2(void* pParam);static TaskHandle_t handler1;
static TaskHandle_t handler2;
static TaskHandle_t appHandler;QueueHandle_t testQueueHandler;//主函数
int main(void)
{ //初始化硬件led_init();BaseType_t xReturn;xReturn = xTaskCreate(vAppInitTask, //任务函数入口"vAppInitTask", //任务名称512, //任务堆栈大小NULL, //传递参数2, //任务优先级&appHandler //任务句柄);if(pdPASS == xReturn){vTaskStartScheduler(); //开启任务调度器}while(1);
}//APP任务
void vAppInitTask(void* pParam)
{taskENTER_CRITICAL();//进入临界区//创建队列testQueueHandler = xQueueCreate(4, //消息队列长度4 //队列中每个元素的大小);if(NULL != testQueueHandler){}//由于app任务创建成功后便开启了调度器,于是下边创建的任务创建后便会立即执行xTaskCreate(task2, //任务函数入口"task2", //任务名称512, //任务堆栈大小NULL, //传递参数2, //任务优先级&handler2 //任务句柄);xTaskCreate(task1, //任务函数入口"task1", //任务名称512, //任务堆栈大小NULL, //传递参数2, //任务优先级&handler1 //任务句柄);vTaskDelete(appHandler);taskEXIT_CRITICAL();//退出临界区
}//任务1接收队列消息
void task1(void* pParam)
{uint32_t recv;xQueueReceive(testQueueHandler,&recv,0);if(recv==1){open();}while(1);
}//任务2发送消息到队列
void task2(void* pParam)
{uint32_t data=1;xQueueSend(testQueueHandler, //队列句柄&data, //入队数据0); //等待时间while(1);
}