当前位置: 首页 > news >正文

FreeRTOS-消息队列的使用

1. 定义队列传输的内容和队列结构体对象

使用 xQueueHandle结构体创建对象

typedef struct
{u8   TaskNum;u8   Cmd;u8 * buf;}QueueObject_t;xQueueHandle xQueue = NULL; 

2. 调用xQueueCreate API创建队列

xQueueCreate()函数:用于创建一个消息队列。

QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );参数说明:
uxQueueLength:	消息队列的长度,即可以存放多少个元素。
uxItemSize:	每个元素的大小,以字节为单位。返回值:
QueueHandle_t类型的指针,代表创建的消息队列。若创建失败,则返回NULL

创建xQueue队列

xQueue = xQueueCreate(20, sizeof(QueueObject_t));

3. 在任务中调用API获取队列消息

xQueueReceive()函数:用于接收消息队列中的数据。

BaseType_t xQueueReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait );参数说明:
xQueue:需要接收数据的消息队列。
pvBuffer:用于存放接收到的数据的内存地址。
xTicksToWait:在未接收到数据时等待的时间。若设置为0,则表示不等待;若设置为portMAX_DELAY则表示无限等待。返回值:
若接收到数据,则返回pdPASS(1);否则,返回errQUEUE_EMPTY。

接收队列消息

void Process_Task(void *pvParameters)
{const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200);BaseType_t xResult = pdFALSE;QueueObject_t xQueueObject = {0};while (1){xResult = xQueueReceive(xcQueue, (void *)&xQueueObject , xMaxBlockTime);if (pdPASS == xResult){/* 接收到的数据保存在xQueueObject 结构体对象里面 */    }}
}

4. 调用API向队列发送数据

xQueueSend()函数:用于向消息队列中发送数据。

BaseType_t xQueueSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait );参数说明:
xQueue:需要发送数据的消息队列。
pvItemToQueue:待发送的数据的内存地址。
xTicksToWait:在消息队列已满时等待的时间。若设置为0,则表示不等待;若设置为portMAX_DELAY则表示无限等待。返回值:
若发送成功,则返回pdPASS(1);否则,返回errQUEUE_FULL。

向队列中发送数据
传递数据时需注意,Queuebject.buf 指针必须指向一个已分配内存地址的空间,不能传递野指针

void SendxQueue(void)
{u8 buf[10]={1,2,3};Queueject_t Queuebject = {0};Queuebject.TaskNum = 0x11;Queuebject.Cmd = 0x01;Queuebject.buf = (u8 *)&buf;xQueueSend(xQueue, (void *)&xCommObject, pdMS_TO_TICKS(10));
}

5. 完整示例

//定义消息体的数据结构
typedef struct
{u8   TaskNum;u8   Cmd;u8 * buf;}QueueObject_t;//创建消息队列的对象
xQueueHandle xQueue = NULL; //获取消息队列数据
void Process_Task(void *pvParameters)
{const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200);BaseType_t xResult = pdFALSE;QueueObject_t xQueueObject = {0};while (1){xResult = xQueueReceive(xcQueue, (void *)&xQueueObject , xMaxBlockTime);if (pdPASS == xResult){/* 接收到的数据保存在xQueueObject 结构体对象里面 */    }}
}//向消息队列发送数据
void SendxQueue(void)
{u8 buf[10]={1,2,3};Queueject_t Queuebject = {0};Queuebject.TaskNum = 0x11;Queuebject.Cmd = 0x01;Queuebject.buf = (u8 *)&buf;xQueueSend(xQueue, (void *)&xCommObject, pdMS_TO_TICKS(10));
}
http://www.lryc.cn/news/216048.html

相关文章:

  • 喜欢 Android 14 的 14 个理由
  • 图解系列--路由器和它庞大的功能
  • DBeaver 23.2.3发布,带来多项增强和修复
  • Proteus仿真--基于51单片机的按键选播电子音乐(仿真文件+程序)
  • node使用http模块
  • Golang Study 进阶
  • Shopee买家通系统详细功能介绍
  • git生成gitee和github两个不同的公钥
  • 基于SSM的同学录网站
  • 第十五节——观察者watch
  • tauri 访问静态资源,响应头为Content-Type:‘text/html‘
  • 【佳学基因检测】Node.js中如何读取并调用内容
  • java根据音频流或者音频的地址获取分贝的工具类
  • Pycharm出现的一些问题和解决办法
  • 进程优先级(nice值,top指令),独立性,竞争性,进程切换(时间片),抢占与出让,并发并行概念
  • 若依微服务集成Mybatis-plus详细教程
  • WebSocket:实现实时双向通信的利器
  • 【uniapp】html和css-20231031
  • Docker Tomcat 搭建文件服务器
  • 无感刷新 token
  • 【MISRA C 2012】Rule 2.6 函数不应该包含未使用的标签声明
  • Ubuntu:使用apache2部署Vue开发的网站
  • 使用IO完成端口实现简单回显服务器
  • 【ROS】Nav2源码之nav2_behavior_tree详解
  • SpringBoot---myBatis数据库操作
  • 力扣541.反转字符串II
  • 撕掉Hadoop标签,Cloudera未来可期吗?
  • 排序算法(1)
  • Top 5 Cutting-edge technology examples 2023
  • 【算法|滑动窗口No.3】leetcode3. 无重复字符的最长子串