Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RS485
rt_mq_消息队列_msg_queue
邮箱_mailbox
通过ticks打印耗时,发现邮件发操作耗时过高,线程中调用的crc校验和对比帧头都花了30ms(数据在30字节以内)
发布于 2025-02-27 17:27:09 浏览:215
订阅该版
项目板子有两个485接口,消息块以结构体指针的形式传输; 内存使用的log很稳定,应该不存在内存的溢出 板子通过485口1(波特率115200)同传感器相连,发modbus命令读寄存器; 然后发送端是板子的另一个485口2(波特率9600),接一个外部的RTU; RTU可以简单理解为信号发送端,将modbus命令发送至485口2(板子这个口用485recv函数持续监听),然后通过我的板子(烧录了我写的消息中间件代码),将RTU这个设备发的modbus命令转发到485口1连接的传感器; 我的中间件代码负责处理传感器返回的数据,最后回传给外部的RTU; 中间件有很多处理流程,会把部分数据上传网络,但我现在把这些流程都屏蔽了,只留下以上所述的一条路径,专门调试其中(RTU->中间转发设备->传感器->中间转发设备->RTU)的延时(总延时目前用示波器看到是365ms的水平),发现几个问题或者说是可以优化的地方  [msg_dispatcher.c](https://club.rt-thread.org/file_download/11e3523aa7fae251) [msg_dispatcher.h](https://club.rt-thread.org/file_download/6bc0b663c02e4011) [msg_Modbus.c](https://club.rt-thread.org/file_download/28d2a76c20c409a2) [msg_Modbus.h](https://club.rt-thread.org/file_download/1e5941ab3e90c8b1) [主程序.c](https://club.rt-thread.org/file_download/04115ba32e2b461a) 因为项目对中间件转发延时是有要求的,要尽可能压缩其中的耗时操作(比如压缩这个延迟到200ms) 以下为log打印  现在主要碰到: 1、rt_mb_send()/rt_mq_send()函数耗时30ms。队列换邮箱无任何改善,其实队列里面本来也传的结构体指针。 2、线程中的485口1的485sendthenrecv耗时70ms超过了byte_tmo(30ms),这个是正常了,因为传感器断帧50ms。 3、从485sendthenrecv(485口1)到from_msg_send->send_cb(recv_buffer, recv_len)之间的校验过程花费30~40ms。 4、回调modbus数据发回给msg_cb_to_rtu的485(485口2)单纯一个发send操作竟然耗时60ms,但我byte_tmo设置才25ms。 如果耗时是合理的,希望也能得到相应的解答 该关闭的线程都关的差不多了,唯二的两个线程优先级调高不论是相同和不同,对延时都没有帮助 调整线程create的执行超时参数也无帮助 求助以上延时高的原因,欢迎大佬指正,定知无不言
查看更多
2
个回答
默认排序
按发布时间排序
踩姑娘的小蘑菇
2025-02-27
这家伙很懒,什么也没写!
先确认调试串口波特率;如果没启用异步print,先把打印去掉,计算好耗时后打印一次,排查打印耗时干扰 邮箱send后,在send函数中会立即唤醒阻塞邮箱的线程并进行线程调度,这里30ms是明显不合理的
lchnu
2025-03-06
Witness, Understand, Skill
首先开启异步ulog测试一下,115200bps速度下,一秒最多也只能发送11520Byte(8数据位,1起始位,1停止位),还不计算log过程中一层层找到串口调用putc函数,其间也会被线程打断。 首先要排除串口log过程中所消耗的时间,所以用ulog异步方式,将打印环节都通过低优先级的异步线程处理(第二幅图中使能异步模式),然后再排查你的代码逻辑。  
撰写答案
登录
注册新账号
关注者
0
被浏览
215
关于作者
JH055
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
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
Studio环境下ST M7系列USB主机(CherryUSB)配置及踩坑
2
RTT串口查找函数使用过程中遇到的问题。
3
RT-Thread CI编译产物artifacts自动上传功能介绍
4
STM32G030移植RT-Thread
5
CubeMX & RT-Thread Studio 联合开发说明
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
rt-smart
RTC
FAL
I2C_IIC
cubemx
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
Debug
SFUD
ulog
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
4
个答案
2
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
a1012112796
2
个答案
1
次被采纳
聚散无由
2
个答案
1
次被采纳
加缪
1
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部