完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
开启telnet后, 在msh中使用netstat指令, 程序进入死循环直至崩溃. 使用netstat指令会调用ethernetif.c中list_tcps()函数, 调用该函数时使用了rt_enter_critical(); 随后程序调用了rt_kprintf(); 因为切换了telnet作为console, rt_kprintf()会引起telnet_write()调用, 该函数代码中使用了rt_mutex_take(telnet->tx_ringbuffer_lock, RT_WAITING_FOREVER); rt_mutex_take()函数会检查scheduler是否被锁, 实际上因为之前调用rt_enter_critical()已经将scheduler上锁, 会打印调试信息调用rt_kprintf. 至此死循环形成rt_kprintf -> telnet_write -> rt_mutex_take -> rt_kprintf->…死循环形成. 解决方法: 在list_tcps()中进入临界段后, 先将信息打印到buff, 退出临界段后, 将buff中的信息进行进行rt_kprintf. 目前尝试用这种方法解决. 其他: 在其他使用设备方式的代码中是否也存在类似问题, 需要考虑. |
|
相关推荐
2个回答
|
|
|
|
|
|
采用了第一种方法修改, 目前测试可以用.
同时需要修改: void list_udps(void); 如果使用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: %sn", 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: %sn", 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: %sn", tcp_debug_state_str(pcb->state)); } rt_exit_critical(); rt_kprintf(buff_start); rt_free(buff_start); } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1080 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3694 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1501 浏览 0 评论
2221 浏览 0 评论
1686 浏览 0 评论
75446 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 19:13 , Processed in 0.364381 second(s), Total 39, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号