- 本帖最后由 sync 于 2019-9-10 16:58 编辑 *
使用了f407的板子,msh使用串口时,可以正常工作,一旦执行telnet_server命令后,很容易死机,
发现其他线程里面遇到LOG_D就死机。啥原因呢?一开始telnet线程内存是2048,能看到死机故障是从rt_kprinf引起的,我修改为4096后,死机时调用关系截图如下:
问题最终解决了,但原因却不是十分明白
telnet.c修改地方1:将telnet_thread中主循环内的send_to_client(telnet);注销掉。
while (1)
{
/* try to send all data in tx ringbuffer */
//send_to_client(telnet);
/* do a rx procedure */
if ((recv_len = recv(telnet->client_fd, recv_buf, RECV_BUF_LEN, 0)) > 0)
{
process_rx(telnet, recv_buf, recv_len);
}
else
{
/* close connection */
client_close(telnet);
break;
}
}
修改地方2:将函数telnet_write 内的send_to_client(telnet);注销掉。
static rt_size_t telnet_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
{
const rt_uint8_t *ptr;
ptr = (rt_uint8_t*) buffer;
rt_mutex_take(telnet->tx_ringbuffer_lock, RT_WAITING_FOREVER);
while (size)
{
if (*ptr == '<br>')
rt_ringbuffer_putchar(&telnet->tx_ringbuffer, ' ');
if (rt_ringbuffer_putchar(&telnet->tx_ringbuffer, *ptr) == 0) /* overflow */
break;
ptr++;
size--;
}
rt_mutex_release(telnet->tx_ringbuffer_lock);
/* send data to telnet client */
// send_to_client(telnet);
return (rt_uint32_t) ptr - (rt_uint32_t) buffer;
}
修改地方3:新建一个发送线程,里面单独放置send_to_client(telnet);
while (1)
{
/* try to send all data in tx ringbuffer */
send_to_client(telnet);
rt_thread_mdelay(100);
}
这样处理后,原来msh死机的情况就没有了
https://club.rt-thread.org/ask/question/429718.html
这个帖子里面有另外一个telnet的软件包,你可以实际测试下咋样