入队阻塞:往队列写数据时,队列满时的阻塞。当阻塞结束时,优先级最高的任务优先进入就绪态,同 优先级时,阻塞时间最长的进入就绪态
出队阻塞:读队列时,队列为空时的阻塞。当阻塞结束时,优先级最高的任务优先进入就绪态,同优先 级时,阻塞时间最长的进入就绪态
数据的操作:FIFO机制:先进的先出
也可以强制写队列头部:覆盖头部数据
数据的传输时:值拷贝方式
创建队列函数:
/* uxQueueLength 队列长度,最多能存放多少个数据(item)
uxItemSize 每个数据(item)的大小:以字节为单位
返回值 非0:成功,返回句柄,以后使用句柄来操作队列
NULL:失败,因为内存不足
*/
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
队列复位函数
/* pxQueue : 复位哪个队列;
* 返回值: pdPASS(必定成功)
*/
BaseType_t xQueueReset( QueueHandle_t pxQueue);
队列删除函数
/*参数:队列的句柄*/
void vQueueDelete( QueueHandle_t xQueue );
写队列函数
/* 等同于xQueueSendToBack():参数都相同,名字不一样,往尾部写数据 */
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 xTicksToWait
);
/* 往队列头部写入数据,此函数可以在中断函数中使用,不可阻塞*/
BaseType_t xQueueSendToFrontFromISR(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
/*参数说明
xQueue :队列句柄,要写哪个队列
pvItemToQueue :数据指针,这个数据的值会被复制进队列,
xTicksToWait :任务阻塞时间
设为0,无法写入数据时函数会立刻返回;
设为portMAX_DELAY,则会一直阻塞直到有空间可写
返回值 :pdPASS:数据成功写入了队列
:errQUEUE_FULL:写入失败,因为队列满了。
*/
任务读队列
//任务
BaseType_t xQueueReceive( QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait );
//中断
BaseType_t xQueueReceiveFromISR(
QueueHandle_t xQueue,
void *pvBuffer,
BaseType_t *pxTaskWoken
);
/*参数说明
xQueue :队列句柄,要写哪个队列
pvBuffer :数据指针,读出队列的数据存放处,
xTicksToWait :任务阻塞时间
设为0,无法读出数据时函数会立刻返回;
设为portMAX_DELAY,则会一直阻塞直到有数据可以读出
返回值 :pdPASS:数据成功写入了队列
:errQUEUE_FULL:读出失败,因为队列没有数据。
*/
队列覆盖函数
/* 覆盖队列,对于数据队列长度为1的才可以使用,不会阻塞
* xQueue: 写哪个队列
* pvItemToQueue: 数据地址
* 返回值: pdTRUE表示成功, pdFALSE表示失败
*/
BaseType_t xQueueOverwrite(
QueueHandle_t xQueue,
const void * pvItemToQueue
);
BaseType_t xQueueOverwriteFromISR(
QueueHandle_t xQueue,
const void * pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
读队列,不清除原数据函数
/* 偷看队列
* xQueue: 读哪个队列
* pvItemToQueue: 数据地址, 用来保存读出来的数据
* xTicksToWait: 阻塞时间
* 返回值: pdTRUE表示成功, pdFALSE表示失败
*/
BaseType_t xQueuePeek(
QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait
);
BaseType_t xQueuePeekFromISR(
QueueHandle_t xQueue,
void *pvBuffer,
);
队列查询函数
/*返回队列中可用数据的个数*/
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
/* 返回队列中可用空间的个数*/
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );