文章目录
- 一、队列的操作
- 二、学习总结
在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)