FreeRTOS基础四:特殊的队列之邮箱

邮箱(Mailbox)

FreeRTOS中的队列有一种特殊的用法,我们把它叫做邮箱。邮箱不是另一种组件,它还是队列,只是用法比较特殊而已。

邮箱是长度为1的队列,下文都用邮箱这个词代替。接收数据的任务或者中断ISR从这个邮箱中读取数据的时候,并不会将这个数据从邮箱中删除,它会一直保留,直到新的数据被写入到邮箱覆盖之前的数据。任何任务或者ISR都可以从这个邮箱中读取数据。

In other words, In the case of a mailbox, a writes task sends data to the queue and a receiver task reads data from the queue but does not remove it until it is overwritten by a sender task.

写入数据到邮箱

向邮箱中写入新的数据,要用xQueueOverwrite()而不是xQueueSendToBack()函数。如果邮箱满了,则xQueueOverwrite()会覆盖之前邮箱中的数据而永远不会阻塞。注意只能对长度为1的队列使用这个函数。

BaseType_t xQueueOverwrite( QueueHandle_t xQueue, const void * pvItemToQueue );

参数xQueue:邮箱的句柄

参数pvItemToQueue:存放到邮箱中的数据的指针。邮箱将存储此指针指向的数据的备份。

返回值:只可能返回pdPASS,没有其他返回值。因为是覆盖写入,而不需要等待邮箱有空闲空间,所以总是能写入成功。

从邮箱中读取数据

使用内核函数xQueuePeek()来从邮箱读取一个元素,但不会将这个元素从邮箱中删除,也不会修改它。

BaseType_t xQueuePeek( QueueHandle_t xQueue,
                       void * const pvBuffer,
                       TickType_t xTicksToWait );

此函数的参数和返回值用法与xQueueReceive()一致,这里不再赘述。

你可能感兴趣的:(FreeRTOS学习笔记,freertos,嵌入式)