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