队列又称消息队列,是一种常用于任务间通信的数据结构, 队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息。 消息队列是一种异步的通信方式。
任务先得到的是最先进入消息队列的消息,即先进先出原则(FIFO),但是也支持后进先出原则(LIFO)
十分重要的阻塞机制!
只有在任务中发送消息才允许进行阻塞状态,而在中断中发送消息不允许带有阻塞机制的
需要调用在中断中发送消息的 API 函数接口,因为发送消息的上下文环境是在中断中,不允许有阻塞的情况。
消息队列常用函数:
1)消息队列创建函数:xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
消息队列的长度 消息单元的大小
函数返回值为一个队列句柄
此函数是通过动态方式分配内存创建消息队列,需要配置
#define configSUPPORT_DYNAMIC_ALLOCATION 1 配置动态分配内存
如果使用静态分配内存 ,需要使用xQueueCreateStatic()函数
2)消息队列删除函数 :vQueueDelete(QueueHandle_t xQueue)
需要注意的是调用删除消息队列函数前,系统应存在 xQueueCreate()或 xQueueCreateStatic()函数创建的消息队列。
此外vQueueDelete()也可用于删除信号量。 如果删除消息队列时,有任务正在等待消息, 则不应该进行删除操作
3)向消息队列发送消息函数:xQueueSend(QueueHandle_t xQueue, const void *pvItemToQueue, Ticktype_t xTincksTowait);
队列句柄 指针,指向要送到队尾的队列消息 最大超时时间
xQueueSendFromISR(QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t pxHigherpriorityTaskWoken)
是 xQueueSend()的中断保护版本,用于在中断服务程序中向队列尾部发送一个队列消息
xQueueSendToFront() 发往队首的; xQueueSendToFrontFromISR ()带有中断保护的 发往队首的
4)消息队列接收函数:xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait)
xQueueReceiveFromISR(QueueHandle_t xQueue, void *pvBuffer, BaseType_t pxHigherpriorityTaskWoken) 用于中断的 过 程中 接 收消息
消息队列使用注意事项:
1)一定要先创建消息队列、定义存储数据的地址,确保数据区域和消息大小问题,避免引发地址非法错误。
2)无论是发送或者是接收消息都是以拷贝的方式进行, 如果消息过于庞大,可以将 消息的地址作为消息进行发送、接收