在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()函数向队列发送数据。
应用场景:
- 多任务数据传递:在多任务应用中,队列常用于传递任务间的执行结果或控制命令,实现任务的解耦和模块化设计。
- 资源共享与同步:队列可用于共享资源的访问控制,通过发送和接收信号来实现资源的请求和释放,确保资源的有效同步。
- 等等
参考: