STM32F767不开启libc时ping丢包

发布于 2019-07-23 22:37:08    浏览:801
    本帖最后由 moss 于 2019-7-23 22:55 编辑


开发板:正点原子 F767 阿波罗开发板
Keil版本:5.26.2.0
rt-thread版本:2019.7.21 github master版

关闭 libc 时:
电脑 ping 开发板
1.png
开发板 ping 电脑
2.png

打开 libc 后:
电脑 ping 开发板
3.png
开发板 ping 电脑
4.png

配置差异:
5.png


有没有人知道是哪里的问题?
附件是两种情况下的配置和 wireshark 抓包文件




下载附件[ping丢包.config]
下载附件[ping丢包.pcapng]
下载附件[ping正常.config]
下载附件[ping正常.pcapng]

查看更多

4 个回答
moss
moss 2019-07-26
This guy hasn't written anything yet
另一个发现,在开启了 libc 后也可能存在 ping 丢包现象(实际没丢,只不过响应慢),这种情况下 添加 network_sample 软件包里的 tcpclient_sample.c 后就正常了,去掉就有 丢包现象
moss
moss 2019-09-04
This guy hasn't written anything yet
    struct hostent *host = RT_NULL;
int sock;
struct sockaddr_in server_addr;
int port;
int send_len_total;

do {
log_d("getting hostname");
host = gethostbyname(dev_conf.server_addr);
if(host == RT_NULL) {
LOG_E("gethostname failed");
rt_thread_mdelay(5000);
}
LOG_D("hostname %s, len %d", host->h_name, host->h_length);
} while(host == RT_NULL);

//rt_memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
试验证明加上注释掉的那一句

//rt_memset(&server_addr, 0, sizeof(server_addr)); 
或者前面改成
    int sock = -1;
struct sockaddr_in server_addr;
int port = 0;
int send_len_total = 0;
给三个变量赋初值后,ping timeout 或部分丢包的现象没有了
反复查看代码,发现这三个变量在第一次使用前都进行了赋值
通过调试发现加不加 rt_memset,在传递给 connect 函数之前,server_addr 的地址和值都是相同的

有没有哪些调试的方向,可以进一步确定问题的根源?


moss
moss 2019-09-04
This guy hasn't written anything yet
如果加入用 LOG_HEX 打印 server_addr 的内容,或者加入LOG_D 打印 server_addr 的地址,ping 就正常了
不知道为什么
moss
moss 2019-09-04
This guy hasn't written anything yet
把 server_addr 变成全局变量也不行,但是只要加一个 rt_printk 打印地址就好了
ping 出错时报文如下:
ping-twice.png

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
801

发布
问题

分享
好友

手机
浏览

扫码手机浏览