Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
C++_cpp
rt_mq_消息队列_msg_queue
消息队列使用与C++使用
发布于 2021-09-30 13:34:56 浏览:1347
订阅该版
1. 使用C++的rtthread::Queue队列 ```c++ #include
#include
#include
rtthread::Queue
, 100> testQueue; void printVector(const std::vector
&vec) { for(const auto &v:vec) { rt_kprintf("%02X ", v); } rt_kprintf("\r\n"); } void TestCppQueue() { std::vector
testVec(0); for(uint16_t i=0; i<10; i++) testVec.emplace_back(i); testQueue.put(testVec, 5); testVec.clear(); /* 增加出队前对进队后的数据进行修改*/ // for(uint16_t i=0; i<10; i++) // testVec.emplace_back(9-i); // testVec.clear(); testQueue.get(testVec); printVector(testVec); } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(TestCppQueue, test cpp message ); ``` 此时输出: ![微信截图_20210930113608.png](https://oss-club.rt-thread.org/uploads/20210930/50385ffb98cbeb176c4ac1c4ef50c36b.png) 在数据进队后,出队前,对已经进队的数据进行修改: ```c++ void TestCppQueue() { std::vector
testVec(0); for(uint16_t i=0; i<10; i++) testVec.emplace_back(i); testQueue.put(testVec, 5); testVec.clear(); /* 增加出队前对进队后的数据进行修改*/ for(uint16_t i=0; i<10; i++) testVec.emplace_back(9-i); testVec.clear(); testQueue.get(testVec); printVector(testVec); } ``` 则输出: ![微信截图_20210930113626.png](https://oss-club.rt-thread.org/uploads/20210930/03ffaecaaf620c0ed18ae87793483ba3.png) 这跟预期的结果不一样。 2. 用C进行测试: ```c #include
#define DBG_TAG "main" #define DBG_LVL DBG_LOG #include
struct msg { rt_uint8_t *data_ptr; /* 数据块首地址 */ rt_uint32_t data_size; /* 数据块大小 */ }; /* 消息队列控制块 */ static struct rt_messagequeue mq; /* 消息队列中用到的放置消息的内存池 */ static rt_uint8_t msg_pool[2048]; /* 消息队列示例的初始化 */ int MsgMqInit(void) { static rt_uint8_t isInit = 0; if(isInit ==1) return 0; isInit = 1; rt_err_t result; /* 初始化消息队列 */ result = rt_mq_init(&mq, "mqt", &msg_pool[0], /* 内存池指向 msg_pool */ 16, /* 每个消息的大小是 1 字节 */ sizeof(msg_pool), /* 内存池的大小是 msg_pool 的大小 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,优先级大小的方法分配消息 */ if (result == RT_EOK) return 0; LOG_E("init message queue failed.\n"); return -1; } void printData( rt_uint8_t *dataBuf, rt_uint16_t dataLen) { for(rt_uint16_t i=0; i
查看更多
1
个回答
默认排序
按发布时间排序
出出啊
2021-09-30
恃人不如自恃,人之为己者不如己之自为也
先说说最后这个官方的解释,他的意思是说,对于消息队列自己有缓存,`rt_mq_init` 的第三个参数 msg_pool 就是,发消息的时候, `rt_mq_send` 先把你提供的消息体拷贝到 msg_pool 这个消息池内。接收的时候反向从 msg_pool 拷贝到接收方的局部变量。 你写的 send_op 函数仅仅传输了个局部变量地址,这个的万万不行的。 最后,说说开头的 vector 容器,怎么 get put clear 都没执行一样。你打印的结果就是 for 循环 emplace_back 的值,进一步严重,可以 ``` /* 增加出队前对进队后的数据进行修改*/ for(uint16_t i=0; i<10; i++) testVec.emplace_back(9-i+100); testVec.clear(); ```
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
parjing
认真学习
提问
13
回答
8
被采纳
0
关注TA
发私信
相关问题
1
rt_object_init中报assertion failed错误?
2
在 MDK中的NANO 里创建消息队列失败,内存堆已开启
3
如何用消息队列传递结构体数据
4
消息队列满了以后接收乱码
5
消息队列传输不定长数据
6
使用消息队列在线程中发送总失败
7
初始化第二个消息队列时发生硬件错误
8
rtthread消息队列一对多的情况
9
消息队列为什么会出现获取到的内容有旧的数据?
10
通过消息队列名称,获取消息队列句柄
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
EtherKit快速上手PROFINET
2
RTThread USB转串口无法接收数据
3
HC32F4A0 SD卡挂载及热插拔的实现
4
vscode插件 - RT-Thread Studio项目助手 | 跨平台开发
5
Console串口使用说明
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部