目录
1、定义
2、函数介绍
1、队列创建
2、队列删除
3、写队列
4、读队列
3、实例
1、定义
队列是freertos所有任务通信或同步之外的机制,队列包含多个数据称为长度,每个数据大小相同,创建队列时需要用到长度和数据大小。数据的读写方法采用先进先出的方式(FIFO),一般使用时,写数据,数据放到尾部;读数据,从队列头部开始读。
2、函数介绍
1、队列创建
队伍创建分为:动态创建和静态创建,区别在于创建时内存分配情况。
动态创建函数:队伍内存动态分配(任务动态创建时使能的宏相同,具体上一篇文章)
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, //队列长度
UBaseType_t uxItemSize //数据大小
)
//返回值:成功,返回队列句柄;失败,返回NULL
静态创建函数:队伍内存需要事先分配好。
QueueHandle_t xQueueCreateStatic(
UBaseType_t uxQueueLength, //队列长度
UBaseType_t uxItemSize, //数据大小
uint8_t *pucQueueStorageBuffer, //uxItemSize非零,数组大小至少为长度乘以数据大小
//uxItemSize为零,数组为NULL
StaticQueue_t *pxQueueBuffer //该变量用于保存队列的数据结构。
)
//返回值:成功,返回队列句柄;失败,返回 0
2、队列删除
函数:
void vQueueDelete( QueueHandle_t xQueue );
/*
功能:删除先前通过调用xQueueCreate()或xQueueCreateStatic()创建的队列。vQueueDelete()也可用
于删除信号量
参数:句柄
*/
3、写队列
//往队列尾部写入数据,如果没有空间,阻塞时间为xTicksToWait,两个函数等价
BaseType_t xQueueSend(
QueueHandle_t xQueue, //目标队列句柄
const void *pvItemToQueue,//写入数据的地址
TickType_t xTicksToWait //阻塞时间
)
BaseType_t xQueueSendToBack(
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
)
//往队列头部写入数据,如果没有空间,阻塞时间为xTicksToWait
BaseType_t xQueueSendToFront(
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
)
//返回值:返回PDPASS,数据成功发送到队列;返回errQUEUE_FULL,队列已满无法将数据写入
/********************************************************************************/
//xQueueSendToBack()的一个版本,即使队列已满,它也会写入队列,覆盖队列中已经保存的数据
//xQueueOverwrite()用于长度为1的队列,这意味着队列要么为空,要么为满。
BaseType_t xQueueOverwrite(
QueueHandle_t xQueue,//目标队列句柄
const void * pvItemToQueue//写入数据的地址
)
//返回值:pdPASS是唯一可以返回的值,因为即使队列已经满了
/***********************************************************************************/
* 中断函数写入数据
/***********************************************************************************/
//往队列尾部写入数据,此函数可以在中断函数中使用,不可阻塞
BaseType_t xQueueSendToBackFromISR(
QueueHandle_t xQueue,//目标队列句柄
const void *pvItemToQueue,//写入数据的地址
BaseType_t *pxHigherPriorityTaskWoken
//
)
//往队列头部写入数据,此函数可以在中断函数中使用,不可阻塞
BaseType_t xQueueSendToFrontFromISR(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
)
//返回值:返回PDTRUE,数据成功发送到队列;errQUEUE_FULL无法将数据发送到队列,队列已满。
//即使队列已满,也会写入队列,覆盖队列中已经保存的数据。
//xQueueOverwriteFromISR()用于长度为1的队列,这意味着队列要么为空,要么为满。
BaseType_t xQueueOverwriteFromISR(
QueueHandle_t xQueue,
const void * pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
)
//返回值:pdPASS是唯一可以返回的值,覆盖写入队列,即使队列已满。
4、读队列
BaseType_t xQueueReceive(
QueueHandle_t xQueue,//目标队列句柄
void * const pvBuffer,//接收数据存储的指针
TickType_t xTicksToWait
//阻塞时间,如果被设为portMAX_DELAY,则会一直阻塞直到有数据可写
)
//返回值:返回pdPASS,成功地从队列读取数据;返回errQUEUE_EMPTY,由于队列为空无法从队列读取数据
//从队列中读取数据,但不从队列中移除数据。
BaseType_t xQueuePeek(
QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait
)
//返回值:返回pdPASS,成功地从队列读取数据;返回errQUEUE_EMPTY,由于队列为空无法从队列读取数据
BaseType_t xQueuePeekFromISR(
QueueHandle_t xQueue,
void *pvBuffer,
)
//返回值:返回pdPASS,成功地从队列读取数据;返回errQUEUE_EMPTY,由于队列为空无法从队列读取数据
BaseType_t xQueueReceiveFromISR(
QueueHandle_t xQueue,
void *pvBuffer,
BaseType_t *pxTaskWoken
)
//返回值:返回pdPASS,成功地从队列读取数据;返回pdFAIL,由于队列为空而无法从队列读取数据
3、实例
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
QueueHandle_t xQueue;//设置队列句柄
TaskHandle_t xHandleTask1 = NULL;//任务句柄,用于删除
TaskHandle_t xHandleTask2 = NULL;
void Task1_write(void *param)
{
BaseType_t xStatus=pdPASS;//接收返回值
int Senddata=100;
while(1)
{
xStatus = xQueueSendToBack( xQueue, &Senddata, 0 );
if(xStatus != pdPASS)
{
printf("send failure");
}
}
}
void Task2_read(void *param)
{
int recydata=0;//用于存取接收到的数据
BaseType_t xStatus=pdPASS;//接收返回值
while(1)
{
xStatus = xQueueReceive( xQueue, &recydata, 100);
if( xStatus == pdPASS )
{
printf( "Received = %d\r\n", recydata);
}
}
}
int main( void )
{
xQueue = xQueueCreate( 5, sizeof( int32_t ));
xTaskCreate(Task1_write,"Task1",100,NULL,1,&xHandleTask1);
xTaskCreate(Task2_read,"Task2",100,NULL,1,&xHandleTask2);
vTaskStartScheduler(); // 启动任务,开启调度
while(1); // 正常不会执行到这里
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)