文章目录
- 一、队列的操作
 - 二、学习总结
 
在FreeRTOS中,队列的本质是环形缓冲区。
一、队列的操作
1、创建队列 2、写队列 3、读队列
详细可看此篇博客:FreeRTOS——队列(基于百问网DshanMCU-F103实现挡球板游戏改造)-CSDN博客
基于链表解析队列的使用:
 
代码示例:
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
static QueueHandle_t g_xQueueInput;
/**********************************************************************
 * 函数名称: InitInputQueue
 * 功能描述: 初始化输入队列-创建队列
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 0-成功, 其他值-失败
 ***********************************************************************/ 
int InitInputQueue(void)
{
	//创建队列
	g_xQueueInput = xQueueCreate(BUFFER_SIZE, sizeof(InputEvent));
	if (g_xQueueInput == NULL)
	{
		printf("can not create queue\r\n");
		return -1;
	}
	else
	{
		return 0;
	}
	
}
/**********************************************************************
 * 函数名称: PutInputEvent
 * 功能描述: 往环形缓冲区放入数据-写队列操作
 * 输入参数: ptInputEvent-输入事件
 * 输出参数: 无
 * 返 回 值: 0-成功, 其他值-失败
 ***********************************************************************/ 
int PutInputEvent(PInputEvent ptInputEvent)
{
	/* 写队列 */
	xQueueSendFromISR(g_xQueueInput, ptInputEvent, NULL);
	return 0;
}
/**********************************************************************
 * 函数名称: GetInputEvent
 * 功能描述: 从环形缓冲区读取数据-读队列操作
 * 输入参数: 无
 * 输出参数: ptInputEvent-用来保存输入事件
 * 返 回 值: 0-成功, 其他值-失败
 ***********************************************************************/ 
int GetInputEvent(PInputEvent ptInputEvent)
{
	/* 读队列 */
	xQueueReceive(g_xQueueInput, ptInputEvent, portMAX_DELAY);
	return 0;
}
 
上述代码,能够实现向输入环形缓冲区中写入/读取数据的操作,队列的使用能够使程序变得简单易懂,可读性变高。
二、学习总结
队列在FreeRTOS中是用于任务间或任务与中断服务程序之间通信的机制,它支持任务间的数据交换和信息同步。API函数提供队列创建、删除、重置以及查看队列状态等功能,使开发者能够灵活管理队列资源。
FreeRTOS提供了多种队列,如xQueue、xQueueCreateMutex和xQueueCreateCountingSemaphore等,分别适用于不同的使用场景。
任务通过xQueueSend()函数向队列发送数据,而xQueueReceive()用于从队列接收数据。中断服务程序通过xQueueSendFromISR()函数向队列发送数据。
应用场景:
- 多任务数据传递:在多任务应用中,队列常用于传递任务间的执行结果或控制命令,实现任务的解耦和模块化设计。
 - 资源共享与同步:队列可用于共享资源的访问控制,通过发送和接收信号来实现资源的请求和释放,确保资源的有效同步。
 - 等等
 
参考:
深入理解FreeRTOS队列之队列实战 (100ask.net)


















