Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
msh
telnet
v4.10版本, 在telnet中使用netstat指令卡死
发布于 2022-03-27 19:21:11 浏览:1522
订阅该版
开启telnet后, 在msh中使用netstat指令, 程序进入死循环直至崩溃. 问题定位: 1. 使用netstat指令会调用ethernetif.c中list_tcps()函数, 调用该函数时使用了rt_enter_critical(); 随后程序调用了rt_kprintf();![微信截图_20220327190503.png](https://oss-club.rt-thread.org/uploads/20220327/e68b22e0f8babc90df1abfb87ddf6cd4.png) 2. 因为切换了telnet作为console, rt_kprintf()会引起telnet_write()调用, 该函数代码中使用了rt_mutex_take(telnet->tx_ringbuffer_lock, RT_WAITING_FOREVER);![微信截图_20220327191536.png](https://oss-club.rt-thread.org/uploads/20220327/65589236335ceaa929cf6ab16dfb8f9d.png) 3. rt_mutex_take()函数会检查scheduler是否被锁, 实际上因为之前调用rt_enter_critical()已经将scheduler上锁, 会打印调试信息调用rt_kprintf.![微信截图_20220327191630.png](https://oss-club.rt-thread.org/uploads/20220327/db7e8ce1d1d7b7994c305018582b3e37.png)![微信截图_20220327191709.png](https://oss-club.rt-thread.org/uploads/20220327/0f9afab7b3b41db2516a1ae96746fe0c.png) 4. 至此死循环形成rt_kprintf -> telnet_write -> rt_mutex_take -> rt_kprintf->...死循环形成. 解决方法: 1. 在list_tcps()中进入临界段后, 先将信息打印到buff, 退出临界段后, 将buff中的信息进行进行rt_kprintf. 目前尝试用这种方法解决. 2. 解决telnet_write中rt_mutex_take使用问题. 其他: 在其他使用设备方式的代码中是否也存在类似问题, 需要考虑.
查看更多
3
个回答
默认排序
按发布时间排序
aozima
2022-03-27
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
你分析得对,感谢分享!
出出啊
2022-03-28
恃人不如自恃,人之为己者不如己之自为也
谈缓存的重要性 是不是在 rt_mutex_take/release 里添加一个临界区的判断呢,如果是在临界区内直接返回退出。
梦回唐朝
2022-03-28
这家伙很懒,什么也没写!
采用了第一种方法修改, 目前测试可以用. 同时需要修改: 1. void list_udps(void); 2. 如果使用list_fd命令也会出现类似问题, 需要修改dfs.c中的这个函数:int list_fd(void). 附: 修改的代码. ``` void list_tcps(void) { rt_uint32_t num = 0; struct tcp_pcb *pcb; char local_ip_str[16]; char remote_ip_str[16]; extern struct tcp_pcb *tcp_active_pcbs; extern union tcp_listen_pcbs_t tcp_listen_pcbs; extern struct tcp_pcb *tcp_tw_pcbs; char *buff = rt_malloc(1024); char *buff_start = buff; rt_enter_critical(); buff += rt_sprintf(buff, "Active PCB states:\n"); for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { strcpy(local_ip_str, ipaddr_ntoa(&(pcb->local_ip))); strcpy(remote_ip_str, ipaddr_ntoa(&(pcb->remote_ip))); buff += rt_sprintf(buff, "#%d %s:%d <==> %s:%d snd_nxt 0x%08X rcv_nxt 0x%08X ", num++, local_ip_str, pcb->local_port, remote_ip_str, pcb->remote_port, pcb->snd_nxt, pcb->rcv_nxt); buff += rt_sprintf(buff, "state: %s\n", tcp_debug_state_str(pcb->state)); } rt_exit_critical(); rt_kprintf(buff_start); rt_enter_critical(); buff = buff_start; buff += rt_sprintf(buff, "Listen PCB states:\n"); num = 0; for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { buff += rt_sprintf(buff,"#%d local port %d ", num++, pcb->local_port); buff += rt_sprintf(buff,"state: %s\n", tcp_debug_state_str(pcb->state)); } rt_exit_critical(); rt_kprintf(buff_start); rt_enter_critical(); buff = buff_start; buff += rt_sprintf(buff,"TIME-WAIT PCB states:\n"); num = 0; for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { strcpy(local_ip_str, ipaddr_ntoa(&(pcb->local_ip))); strcpy(remote_ip_str, ipaddr_ntoa(&(pcb->remote_ip))); buff += rt_sprintf(buff, "#%d %s:%d <==> %s:%d snd_nxt 0x%08X rcv_nxt 0x%08X ", num++, local_ip_str, pcb->local_port, remote_ip_str, pcb->remote_port, pcb->snd_nxt, pcb->rcv_nxt); buff += rt_sprintf(buff,"state: %s\n", tcp_debug_state_str(pcb->state)); } rt_exit_critical(); rt_kprintf(buff_start); rt_free(buff_start); } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
梦回唐朝
这家伙很懒,什么也没写!
提问
2
回答
1
被采纳
0
关注TA
发私信
相关问题
1
用telnet组件提示bind socket failed
2
telnet功能开启之后,断开网线则死机
3
【已解决】msh使用telnet方式很容易死机,哪里问题呢?
4
telnet例程运行一段时间后出现异常,系统复位
5
TELNET 添加用户名和密码
6
agile telnet 后续改进交流
7
telnet_server 能打印 msh 提示符,但输入字符后回车没有反应
8
finsh 中使用错误指令会卡死,rt-thread版本为 3.0.3
9
w5500使用telnet问题?
10
v4.10 console 切换后, 只能输出打印, 不能接收指令
推荐文章
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
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部