FreeRTOS的学习(七)——3.队列出队源码分析

23 篇文章 27 订阅

FreeRTOS的学习系列文章目录

FreeRTOS的学习(一)——STM32上的移植问题
FreeRTOS的学习(二)——任务优先级问题
FreeRTOS的学习(三)——中断机制
FreeRTOS的学习(四)——列表
FreeRTOS的学习(五)——系统延时
FreeRTOS的学习(六)——系统时钟
FreeRTOS的学习(七)——1.队列概念
FreeRTOS的学习(七)——2.队列入队源码分析
FreeRTOS的学习(七)——3.队列出队源码分析
FreeRTOS的学习(八)——1.二值信号量
FreeRTOS的学习(八)——2.计数型信号量
FreeRTOS的学习(八)——3.优先级翻转问题
FreeRTOS的学习(八)——4.互斥信号量
FreeRTOS的学习(九)——软件定时器
FreeRTOS的学习(十)——事件标志组
FreeRTOS的学习(十一)——任务通知


前言

队列在FreeRTOS中起到比较重要的作用,主要用于任务之间消息的传递,取代了裸机时代中的全局变量交互功能。队列的机制实现了任务与任务、任务与中断之间的消息传递。


1 从队列读取消息

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

任务级出队函数
1.xQueueReceive(),从队列中读取队列项(消息),并且读取完以后删除掉队列项(消息)。
2.xQueuePeek(),从队列中读取队列项(消息),并且读取完以后不删除队列项(消息)。
中断级出队函数
1.xQueueReceiveFromISR(),从队列中读取队列项(消息),并且读取完以后删除掉队列项(消息),用于中断服务函数中。
2.xQueuePeekFromISR (),从队列中读取队列项(消息),并且读取完以后不删除队列项(消息),用于中断服务函数中。

本博客主要讲任务级读取队列项的函数,在旧版本中读取的函数不论删除读取项与否,实质上都是执行xQueueGenericReceive()。但是在新版的程序中并没有xQueueGenericReceive(),取而代之的是几种出队函数的详细内容。为了方便起见,只讲解xQueueReceive(),其函数原型如下:

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

参数:
xQueue:队列句柄,指明要读取哪个队列的数据,创建队列成功以后会返回此队列的队列句柄。
pvBuffer:保存数据的缓冲区,读取队列的过程中会将读取到的数据拷贝到这个缓冲区中。
xTicksToWait:阻塞时间,此参数指示当队列空的时候任务进入阻塞态等待队列有数据的最大时间。如果为 0 的话当队列空的时候就立即返回;当为 portMAX_DELAY的话就会一直等待,直到队列有数据,也就是死等,但是宏INCLUDE_vTaskSuspend 必须为 1。
返回值:
pdTRUE:从队列中读取数据成功。
pdFALSE:从队列中读取数据失败。

其实出队和入队的过程是非常相似的。只不过局部一些地方不一样,比如说会把出队的任务挂到xTasksWaitingToReceive列表上,出队时会把数据从队列拷贝到缓存区(prvCopyDataFromQueue)。其他关于阻塞时间等的处理过程基本一致。这里就不赘述了。


3 写在后面

关于出队的函数本想详细分析,但是后来看到源码后,实质上还是和入队大差不差,故只是粗略的讲了下区别,可能还有遗漏,望各位读者不吝赐教。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LEODWL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值