rk2118--RT-Thread 消息队列

1、概述

什么是 RT-Thread 消息队列
RT-Thread 消息队列是一种用于在任务或中断服务例程(ISR)之间传递消息的机制。它允许一个任务或ISR发送数据到消息队列中,而另一个任务可以从消息队列中接收这些数据。消息队列提供了一种异步通信的方式,使得任务之间可以解耦,提高系统的灵活性和可扩展性。

2. RT-Thread 消息队列的工作原理

RT-Thread 消息队列基于先进先出(FIFO)的原则工作。发送者将消息发送到队列的尾部,而接收者从队列的头部获取消息。如果队列为空,接收者可以选择等待直到有消息可用,或者立即返回一个错误表示没有消息可接收。同样,如果队列已满,发送者可以选择等待直到有空闲空间,或者立即返回一个错误表示无法发送消息。

3. 在 RT-Thread 中创建和使用消息队列的步骤

3.1 创建消息队列

在 RT-Thread 中,你可以使用 rt_mq_create 函数来创建一个消息队列。这个函数需要指定队列的名称、消息池的大小、每个消息的大小以及队列的最大长度。

rt_mq_t msg_mq = rt_mq_create("player", 1024, 32, 10);

在这个例子中,我们创建了一个名为 "msg_mq " 的消息队列,消息池大小为 1024 字节,每个消息的大小为 32 字节,队列的最大长度为 10。

3.2 发送消息

使用 rt_mq_send 函数可以向消息队列中发送消息。这个函数需要指定消息队列的句柄、要发送的消息以及消息的长度。

char msg[] = "Hello RT-Thread!";
rt_mq_send(mq, msg, sizeof(msg));

3.3 接收消息

使用 rt_mq_recv 函数可以从消息队列中接收消息。这个函数需要指定消息队列的句柄、用于存储接收到的消息的缓冲区以及缓冲区的长度。此外,还可以指定一个超时时间,如果在指定的时间内没有接收到消息,函数将返回错误。

ret = rt_mq_recv(g_app_info.main_mq, (void *)&rcv_msg, sizeof(struct app_msg), RT_WAITING_FOREVER);
if (ret == RT_EOK)
{RC_LOGI("rcv_msg.value = %d",rcv_msg.value);if (rcv_msg.value >= 0) {}
}

4. 使用 RT-Thread 消息队列时需要注意的事项

‌内存管理‌:消息队列会占用一定的内存空间,包括消息池和队列控制结构。因此,在创建消息队列时,需要确保有足够的内存可用。
‌线程同步‌:消息队列提供了一种线程同步的机制。在发送和接收消息时,RT-Thread 会自动处理线程之间的同步问题,但开发者仍然需要注意避免死锁和优先级反转等问题。
‌错误处理‌:在发送和接收消息时,需要检查函数的返回值以确保操作成功。如果操作失败,需要根据错误码进行相应的处理。

5. RT-Thread 消息队列的示例代码

以下是一个完整的示例代码,展示了如何在 RT-Thread 中创建、发送和接收消息队列:

#include <rtthread.h>#define MSG_POOL_SZ    1024
#define MSG_SIZE       32
#define MSG_QUEUE_LEN  10static void msg_producer(void *parameter)
{rt_mq_t mq = (rt_mq_t)parameter;char msg[MSG_SIZE];int i = 0;while (1){snprintf(msg, MSG_SIZE, "Message %d", i++);rt_mq_send(mq, msg, MSG_SIZE);rt_thread_mdelay(1000); // 1 second delay}
}static void msg_consumer(void *parameter)
{rt_mq_t mq = (rt_mq_t)parameter;char buffer[MSG_SIZE];rt_size_t len;while (1){len = rt_mq_recv(mq, buffer, MSG_SIZE, RT_WAITING_FOREVER);if (len > 0){rt_kprintf("Receive Message: %s
", buffer);}}
}int main(void)
{rt_mq_t mq;rt_thread_t producer_tid, consumer_tid;// Create Message Queuemq = rt_mq_create("mq_test", MSG_POOL_SZ, MSG_SIZE, MSG_QUEUE_LEN);if (mq == RT_NULL){rt_kprintf("Create Message Queue Failed!
");return -1;}// Create Producer Threadproducer_tid = rt_thread_create("producer",msg_producer, (void *)mq,1024, 10, 10);if (producer_tid != RT_NULL)rt_thread_startup(producer_tid);// Create Consumer Threadconsumer_tid = rt_thread_create("consumer",msg_consumer, (void *)mq,1024, 10, 10);if (consumer_tid != RT_NULL)rt_thread_startup(consumer_tid);return 0;
}

在这个示例中,我们创建了两个线程:一个生产者线程和一个消费者线程。生产者线程每隔一秒向消息队列中发送一条消息,而消费者线程则不断从消息队列中接收消息并打印出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scala的模式匹配(3)

package hfd.test32 import scala.io.StdInobject Test34_3 {def main(args: Array[String]): Unit {//从控制台读入一个数字aval aStdIn.readInt()// if (a>0 && a<3){println("[0,3")} // else if(a>4 &&a<8){println("[4…

通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码走进北京大学创新课堂&#xff0c;与 400…

代码随想录第十四天|二叉树part02--226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

资料引用&#xff1a; 226.翻转二叉树&#xff08;226.翻转二叉树&#xff09; 101.对称二叉树&#xff08;101.对称二叉树&#xff09; 104.二叉树的最大深度&#xff08;104.二叉树的最大深度&#xff09; 111.二叉树的最小深度&#xff08;111.二叉树的最小深度&#xff09;…

二阶线性微分方程的幂级数解法

内容来源 常微分方程(第四版) (王高雄,周之铭,朱思铭,王寿松) 高等教育出版社 考虑二阶齐次线性微分方程 d 2 y d x 2 p ( x ) d y d x q ( x ) y 0 \frac{\mathrm{d}^2y}{\mathrm{d}x^2} p(x)\frac{\mathrm{d}y}{\mathrm{d}x}q(x)y0 dx2d2y​p(x)dxdy​q(x)y0 满足初值条…

Java基础面向对象(String类)

String 特点 是内存中常量, 值在内存中一旦创建, 不可改 更改String类型引用的值本质上是将引用指向了一个新的字符串地址 String s1 "abc";String s2 s1;//引用s1的地址赋值给了s2 ​s2 "edf";//让s2指向新字符串 ​System.out.println("s1: &q…

【系统架构设计师】真题论文: 论软件质量保证及其应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2017年 试题4)解题思路论文素材参考软件质量保证定义和重要性软件质量保证在软件开发生命周期中的应用真题题目(2017年 试题4) 软件质量保证 (Software Quality Assurance. SQA) 是指为保证软件系统或…

LeetCode763. 划分字母区间(2024冬季每日一题 23)

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 示例 1&a…

【C++】深入优化计算题目分析与实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;第一题&#xff1a;圆的计算我的代码实现代码分析改进建议改进代码 老师的代码实现代码分析可以改进的地方改进代码 &#x1f4af;第二题&#xff1a;对齐输出我的代码实现…

6.824/6.5840 Lab 3: Raft——Part 3B3C

芙蓉花又栖满了枝头 奈何蝶难留 漂泊如江水向东流 望断门前隔岸的杨柳 寂寞仍不休 我无言让眼泪长流 ——山外小楼夜听雨 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 在完成Lab之前&#xff0c;务必把论文多读几遍&#xff0c;力求完全理解Leader选举、…

LeetCode - #150 逆波兰表达式求值

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

使用go实现一个简单的rpc

什么是rpc, rpc是干什么的?几种协议的压测数据对比:tcphttp 使用tcp实现一个简单的rpc服务 什么是rpc, rpc是干什么的? rpc的作用就是实现远程的服务调用 工作流程: 客户端携带服务信息(服务名,方法名)数据 去请求服务端,服务端拿到数据,解析后执行对应的方法,将结果返回给客…

【C++】continue语句、goto语句

1、continue 语句 作用&#xff1a;在循环语句中&#xff0c;跳过本次循环中余下尚未执行的语句。继续下一次循环。 注意&#xff1a;continue只能用于循环中。 示例&#xff1a; 代码&#xff1a; //continue的用法 #include<iostream> using namespace std; int ma…

最长最短单词

最长最短单词 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入1行句子&#xff08;不多于200个单词&#xff0c;每个单词长度不超过100&#xff09;&#xff0c;只包含字母、空格和逗号。单词由至少一…

ESP32项目 --- 智能门锁(WiFi 蓝牙 OTA)

1 项目简介 1.1 项目概述 本项目是实现一款智能门锁中的智能控制部分, 可以应用在家庭, 办公室等任何使用门锁的场所. 本项目实现了以下主要功能: &#xff08;1&#xff09;通过按键配置密码 &#xff08;2&#xff09;通过按键输入密码开锁 &#xff08;3&#xff09;录…

【Qt】QTableView选中行发生变化时触发的信号

问题 QTableView选中的行发生变化时&#xff0c;使用的信号是QTableView的selectionModel()里的currentChanged信号&#xff0c;界面点击行来回切换&#xff0c;发现怎么也触发不了&#xff1f; 原因 信号槽连接放在了QTableView数据初始化前面&#xff0c;这时候QTableView…

洛谷题单-入门2-分支结构-python-下

找出出现的最早的最大值 count 0 list_number [] while True:list_number.append(list(map(int, input().split())))count 1if count 7:breaklist2_number_total []for i1,i2 in list_number:list2_number_total.append(i1i2)target max(list2_number_total)index 0 if…

Java Collections 深度探索

在 Java 编程中&#xff0c;java.util.Collections是一个非常重要的工具类&#xff0c;它提供了一系列对集合进行操作的静态方法。本文将深入探讨 Java Collections 的功能、用法、优势以及在实际编程中的应用。 一、引言 Java Collections 框架为开发者提供了一套强大而灵活…

Taro小程序开发随记

处理taro小程序显示wangeditor内的a标签跳转 Taro.options.html.transformElement (el) > {if (el.props.class h5-a) {el.__handlers.tap [() > toWebView(el.props.href)]}return el } 处理wangeditor富文本内容中图片视频到小程序中展示问题 <view class&qu…

Pytorch使用手册-What is torch.nn really?(专题九)

我们建议将本教程作为 notebook 而不是脚本运行。要下载 notebook(.ipynb)文件,请点击页面顶部的链接。 PyTorch 提供了精心设计的模块和类,如 torch.nn、torch.optim、Dataset 和 DataLoader,帮助你创建和训练神经网络。为了充分利用这些工具的强大功能并根据你的问题进…

框架模块说明 #05 权限管理_03

背景 权限设计可以分为两个主要方面&#xff1a;操作权限和数据权限。前两篇文章已经详细介绍了操作权限的设计与实现&#xff0c;以及如何将其与菜单关联起来的具体方法。本篇将聚焦于数据权限&#xff0c;为您深入讲解相关的设计与实现方式。 全局开关 Value("${syst…