一、概念
队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断与任务间传递信息,实现了任务接收来自于其他任务或中断的不定长度信息
二、常用函数
(1)xQueueCreate 创建队列
(2)vQueueDelete 删除队列,删除后所有消息都会被回收不能再使用
(3)xQueueSend 、xQueueSendToBack 、xQueueOverwrite 从队列尾部入队
(4)xQueueSendToFront 从队列首部入队
(5)xQueueSendFromISR 、xQueueSendToBackFromISR 、xQueueOverwriteFromISR 从队列尾部入队(带中断保护)
(6)xQueueSendToFrontFromISR 从队列首部入队(带中断保护)
(7)xQueueReceive 出队并删除队列项
(8)xQueuePeek 出队不删除队列项
(9)xQueueReceiveFromISR 出队并删除队列项(带中断保护)
(10)xQueuePeekFromISR出队不删除队列项(带中断保护)
三、代码示例
c
#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);
}