消息队列
一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息;
任务获取方式
先进先出原则(FIFO),或是后进先出原则(LIFO)
队列大小
单个消息空间大小与消息队列长度的乘积
头指针 pcHead、尾指针 pcTail、消息大小 uxItemSize 以及队列长度 uxLength
- 为了保护数据,队列中无可用消息空间时,说明消息队列已满,此时,系统会根据用户指定的阻塞超时时间将任务阻塞,在指定的超时时间内如果还不能完成入队操作,发送消息的任务或者中断服务程序会收到一个错误码 errQUEUE_FULL,然后解除阻塞状态
阻塞机制
1、没有信息,不等待,做其他事情
2、等待,进入阻塞状态,可设置时间;如果超过时间,如1
3、死等,没有阻塞时间设置
常用函数
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength,UBaseType_t uxItemSize );
QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength,
UBaseType_t uxItemSize,
uint8_t *pucQueueStorageBuffer,
StaticQueue_t *pxQueueBuffer );
vQueueDelete(QueueHandle_t );
xQueueSend()与 xQueueSendToBack()、xQueueSendToFront(),以及FromISR
xQueueReceive()与 xQueuePeek()、FromISR
使用:
QueueHandle_t Test_Queue =NULL;
#define QUEUE_LEN 4 /* 队列的长度,最大可包含多少个消息 */
//#define QUEUE_SIZE 4 /* 队列中每个消息大小(字节) */
Test_Queue = xQueueCreate((UBaseType_t ) QUEUE_LEN, sizeof(uint32));