10.1.4. FreeRTOS 队列
10.1.4.1. 队列函数
使用队列的流程:创建队列,写队列,读队列,删除队列
10.1.4.1.1. 创建
队列的创建有两种方法:
动态分配内存: 队列的内存在函数内部动态分配
静态分配内存: 队列的内存要事先分配好
// uxQueueLength: 队列长度,最多存放多少个数据
// uxItemSize: 每个数据的大小
// 动态内存分配法
QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize);
// uxQueueLength: 队列长度
// uxItemSize: 每个数据的大小
// pucQueueStorageBuffer: 需指向uint8_t数组,此数组大小至少为uxQueueLength * uxItemSize
// pxQueueBuffer: 必须执行一个StaticQueue_t结构体,用来保存队列的数据结构
QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength, UBaseType_t uxItemSize,
uint8_t *pucQueueStorageBuffer, StaticQueue_t *pxQueueBuffer);
10.1.4.1.2. 复位
队列刚被创建时,里面没有数据,使用过程中可以调用 xQueueReset
把队列恢复为初始状态
BaseType_t xQueueReset(QueueHandle_t pxQueue)
10.1.4.1.3. 删除
删除队列的函数为 vQueueDelete
只能删除使用动态方法创建的队列,然后释放内存
void vQueueDelete(QueueHandle_t xQueu)
10.1.4.1.4. 写队列
可以把数据写到队列头部,也可以写到尾部.这些函数有两个版本: 在任务中使用,在ISR中使用
//往队列尾部写入数据,如果没有空间,阻塞时间为TicksToWait
BaseType_t xQueueSend(QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait)
//往队列尾部写入数据,此函数在中断函数中使用,不可阻塞
BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken)
//往队列头部写入数据
BaseType_t xQueueSendToFront(QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTickToWait);
//往队列头部写入数据,不可阻塞
BaseType_t xQueueSendToFrontFromISR(QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken);
10.1.4.1.5. 读队列
BaseType_t xQueueReceive(QueueHandle_t xQueue, void *cosnt pvBuffer, TickType_t xTicksToWait)
BaseType_t xQueueReceiveFromISR(QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxTaskWoken)
10.1.4.1.6. 查询
//返回队列中可用数据的个数
UBaseType_t uxQueueMessagesWaiting(const QueueHandle_t xQueue);
//返回队列中可用空间的个数
UBaseType_t uxQueueSpaceAvalible(const QueueHandle_t xQueue)