一、消息队列读取消息

有消息入队就有出队,出队就是从队列中获取队列项(消息),FreeRTOS中出队函数如下表所示:

MCU freeRTOS 消息队列 信号量_数据


1、函数xQueueReceive()

此函数用于在任务中从队列中读取一条(请求)消息,读取成功以后就会将队列中的这条数据删除,此函数的本质是一个宏,真正执行的函数是xQueueGenericReceive()。此函数在读取消息的时候是采用拷贝方式的,所以用户需要提供一个数组或缓冲区来保存读取到的数据,所读取的数据长度是创建队列的时候所设定的每个队列项目的长度,函数原型如下:

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

参数

描述

xQueue

队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的队列句柄。

pvBuffer

保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区

中。

TicksToWait

阻塞时间,此参数指示当队列空的时候任务进入阻塞态等待队列有数据的最大时间。如果为0的话当队列空的时候就立即返回;当为portMAX_DELAY的话就会一直等待,直到队列有数据,也就是死等,但是INCLUDE_vTaskSuspend必须为1。

返回值

pdTRUE:从队列中读取数据成功。pdFALSE:从队列中读取数据失败。

2、函数xQueuePeek()
此函数用于从队列读取一条(请求)消息,只能用在任务中!此函数在读取成功以后不会将消息删除,此函数是一个宏,真正执行的函数是xQueueGenericReceive()。此函数在读取消息的时候是采用拷贝方式的,所以用户需要提供一个数组或缓冲区来保存读取到的数据,所读取的数据长度是创建队列的时候所设定的每个队列项目的长度,函数原型如下:

Base Type_t xQueuePeek(
QueueHandle_t xQueue,
void*pvBuffer,
TickType_t xTicksToWait);

参数

描述

xQueue

队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的队列句柄。

pvBuffer

保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区中。

TicksToWait

阻塞时间,此参数指示当队列空的时候任务进入阻塞态等待队列有数据的最大时间。如果为0的话当队列空的时候就立即返回;当为portMAX_DELAY的话就会一直等待,直到队列有数据,也就是死等,但是INCLUDE_vTaskSuspend必须为1。

返回值

pdTRUE:从队列中读取数据成功。pdFALSE:从队列中读取数据失败。

3、函数xQueueGenericReceive()
不管是函数xQueueReceive()还是xQueuePeek(),最终都是调用的函数
xQueueGenericReceive(),此函数是真正干事的,函数原型如下:

BaseType_t xQueueGenericReceive(
QueueHandle_t xQueue,
void*pvBuffer
TickType_t xTicksToWait
BaseType_t xJustPeek)

参数

描述

xQueue

队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的队列句柄。

pvBuffer

保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区

中。

TicksToWait

阻塞时间,此参数指示当队列空的时候任务进入阻塞态等待队列有数据的最大时间。如果为0的话当队列空的时候就立即返回;当为portMAX_DELAY的话就会一直等待,直到队列有数据,也就是死等,但是INCLUDE_vTaskSuspend必须为1。

XJustPeek

标记当读取成功以后是否删除掉队列项,当为pdTRUE的时候就不用删除,也就是说再调用函数xQueueReceive()获取到的队列项是一样的。当为pdFALSE的时候就会删除掉这个队列项。

返回值

pdTRUE:从队列中读取数据成功。pdFALSE:从队列中读取数据失败。

4、函数xQueueReceiveFromISR()
此函数是xQueueReceive()的中断版本,用于在中断服务函数中从队列中读取(请求)一条消息,读取成功以后就会将队列中的这条数据删除。此函数在读取消息的时候是采用拷贝方式的,所以需要用户提供一个数组或缓冲区来保存读取到的数据,所读取的数据长度是创建队列的时候所设定的每个队列项目的长度,函数原型如下:

BaseType_txQueueReceiveFromISR(
QueueHandle_t xQueue
void*pvBuffer,
BaseType_t*pxTaskWoken);

参数

描述

xQueue

队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的队列句柄。

pvBuffer

保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区中。

pxTaskWoken

标记退出此函数以后是否进行任务切换,这个变量的值是由函数来设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为pdTRUE的时候在退出中断服务函数之前一定要进行一次任务切换。

返回值

pdTRUE:从队列中读取数据成功。pdFALSE:从队列中读取数据失败。

5、函数xQueuePeekFromISR()
此函数是xQueuePeek0的中断版本,此函数在读取成功以后不会将消息删除,此函数原型如下:

BaseType_txQueuePeekFromISR(
QueueHandle_t xQueue,
void*pvBuffer)

参数

描述

xQueue

队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的队列句柄。

pvBuffer

保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区中。

返回值

pdTRUE:从队列中读取数据成功。pdFALSE:从队列中读取数据失败。