FreeRTOS消息队列详解第五讲(全网最全)——队列读取消息

一、消息队列读取消息

有消息入队就有出队,出队就是从队列中获取队列项(消息),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:从队列中读取数据失败。
  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留小乙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值