队列操作(深入理解FreeRTOS队列之队列实战)


在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提供了多种队列,如xQueuexQueueCreateMutexxQueueCreateCountingSemaphore等,分别适用于不同的使用场景。

任务通过xQueueSend()函数向队列发送数据,而xQueueReceive()用于从队列接收数据。中断服务程序通过xQueueSendFromISR()函数向队列发送数据。

应用场景:

  • 多任务数据传递:在多任务应用中,队列常用于传递任务间的执行结果或控制命令,实现任务的解耦和模块化设计。
  • 资源共享与同步:队列可用于共享资源的访问控制,通过发送和接收信号来实现资源的请求和释放,确保资源的有效同步。
  • 等等

参考:

深入理解FreeRTOS队列之队列实战 (100ask.net)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值