Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rt-smart
rt_mq_消息队列_msg_queue
ART-Pi Smart
[ART smart 开发板] 移植RIL到ART-Smart(三)消息队列
发布于 2022-05-19 19:54:09 浏览:505
订阅该版
[tocm] # 背景简介 前面[移植RIL到ART-Smart(二)](https://club.rt-thread.org/ask/article/bdefe83fe2fb1b9c.html)中讲到,本次移植的linux ril中,rild作为一个client与modem通过AT命令交互,同时也作为一个server与应用通信。应用的接口调用和主动上报监听则主要通过消息队列的机制传递。 恰好,RT smart中的消息队列另一位同学已经分享过了,讲解的很详细,[基于POSIX的应用开发之消息队列](https://club.rt-thread.org/ask/article/459d0797a664ee7d.html).所以一些基础的东西我就不画蛇添足了,本次主要集中在如何将linux ril中的用到消息队列的部分替换为POSIX接口,并使之在RT smart上run起来。 # 消息队列 从代码看,当前linux ril使用的是systemV标准的消息队列接口,经过试验,RT smart并不支持这些接口,但是支持POSIX标准的消息队列接口。因此,有必要比较一下POSIX和SystemV标准的消息队列接口异同。 ## SystemV 消息队列 System V消息队列主要有msgget、msgsnd、msgrcv和msgctl四个接口,头文件及定义如下: ```C #include
#include
#include
/*主要功能是根据key值获取一个消息队列的ID。msgflag主要有两个值IPC_CREAT 和IPC_EXC,指是需要新创建消息队列ID。*/ int msgget(key_t key, int msgflg); /*msgsnd与msgrcv主要用于消息队列的发送与接收。这里需要注意的是发送的msgp一般定义为结构体,首个成员为long型,表示消息的类型。如此msgrcv通过指定msgtype来筛选出需要的消息*/ int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); /* msgctl是用来控制消息队列的,其中cmd指进行的操作,buf记录了消息队列的信息。cmd: IPC_STAT: 将msg相关的内核信息存储到buf指向的msqid_ds 结构体中。调用者需拥有阅读权限才可读取。 IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf指向的msqid结构中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。 IPC_RMID:删除msqid标识的消息队列 */ int msgctl(int msqid, int cmd, struct msqid_ds *buf); ``` ## POSIX 消息队列 与之相对应的,POSIX标准的消息队列主要用的接口有: ```C /*打开/创建一个消息队列*/ int mqd_t mq_open(const char *name, int oflag, /* mode_t mode, struct mq_attr* attr */); /*关闭一个消息队列*/ int mq_close(mqd_t mqdes); /*解引用消息队列*/ int mq_unlink(const char *name); /*发送消息*/ int mq_send(mqd_t mqdes,const char *msg_ptr,size_t msg_len,unsigned msg_prio); int mq_timedsend(mqd_t mqdes,const char *msg_ptr,size_t msg_len,unsigned msg_prio,const struct timespec *abs_timeout); /*接收消息*/ size_t mq_receive(mqd_t mqdes,char *msg_ptr,size_t msg_len,unsigned *msg_prio); size_t mq_timedreceive(mqd_t mqdes,char *msg_ptr,size_t msg_len, unsigned *msg_prio,const struct timespec *abs_timeout); /*获取和设置属性*/ int mq_getattr(mqd_t mqdes, struct mq_attr* attr); int mq_setattr(mqd_t mqdes, const struct mq_attr* newattr, struct mq_attr* oldattr); ``` >解引用消息队列并不一定会删除该消息队列,操作系统要等到消息队列引用数为0时才会删除消息队列并释放资源。 # Linux ril中的消息队列 Linux ril中默认使用了三个消息队列 ```C #define MSG2SERVER_QUE_KEY 4499 #define MSG2CLIENT_QUE_KEY 4498 #define MSG2TCPSND_QUE_KEY 4497 ``` 其中, 1. MSG2SERVER_QUE_KEY是rild中,主线程和其他任务线程通讯用的,主线程在初始化参数和创建各个子任务后,会进入mainloop循环,不断监听该消息队列。而其他子线程会按照顺序把任务发送给主线程,如串口接收到数据、接受到client的AT命令、定时任务时间到等。 2. MSG2CLIENT_QUE_KEY 用于rild向client发送消息,client会专门开启一个```ModemThread```用于监听来自rild的消息。 3. MSG2TCPSND_QUE_KEY 则是用于支持TCP相关的命令 # 调试 很遗憾,截止到发帖时间,ril中关于消息队列的调试还是没有成功。 为此我还专门编写了一个mqdemo用于RT smart上的消息队列的测试,但是都以失败告终。目前总结到的异常有: 1. mq_open返回的句柄符号一直是0,所以不能用于正常的通信 2. 接受队列无法解析发送队列传过来的消息内容,一直是0 ![a99af9a5c0feb97290a05566d6abb2b2.png](https://oss-club.rt-thread.org/uploads/20220519/a99af9a5c0feb97290a05566d6abb2b2.png) # 代码 [Linux ril开源组件 github](https://github.com/keipy/linux-rild/) [我的RT-Thread Smart开发仓库 gitee](https://gitee.com/yu-wang-yy/ART-Pi-smart/) # 总结 1. 经过了一个月的使用,整体体验还是很不错的,相对于RTT, RT smart并没有那么开箱即用,还是需要一定的linux应用和操作系统基础的,免不了要偶尔翻翻源码。 2. 使我很惊喜的是,RTT的创始人熊大一直在活动群支持大家,一起解决问题,每周还会有交流会,来自各行各业的开发者各抒己见,探讨需求,这让我对RT smart之后能走的更远充满信心。 3. 由于时间原因,这次的telephony开发体验将暂时告一段落,板子需要寄给下一批开发者了,今后有机会还是要把这个事情继续下去,如果有相关行业的大佬,也可以一起参与进来。 4. 希望能够不断保持对RTT和RT smart的关注,开源是一片大海,大佬们是江河湖海,我虽然只是游弋还海里的一条鱼,也依然相信有一天能拥抱大海。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
AngerCoke
这个人不懒,主要是真的不想写什么
文章
10
回答
2
被采纳
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组件
热门标签
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在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
xiaorui
1
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部