关于Lwip移植-测试ping显示超时

硬件描述:STM32F107VCT6  PHY芯片:DM9161

LWip软件版本:1.4.0

这里没有使用操作系统,裸机移植Lwip。

      注意点:调试过程中由于这里我使用串口打印调试,使用了printf重映射,在寻找数据走向的时候这里开始一直没有打印信息,后来发现是在测试打印的C文件中没有包含串口重映射的函数的头文件,这里使用printf编译器也没有警告。

    这里关于具体文件的移植和工程的建立,网上有很多的文章介绍,这里自己也是参照网友的帖子来一步步移植,感谢这些网友的帮助。这里在移植过程中涉及到很多宏定义的开启,这里建议大家在移植过程中多关注这里宏定义的意义。这样会对你对项目后期的理解很有帮助,毕竟我们这里是站在巨人的肩膀上去使用这么一套协议栈。


问题描述:这里网卡的显示灯可以正常闪速,自己在网卡接收函数入口打印也发现有接收到数据。这里ping的结果就是显示超时,这里使用抓包软件Wireshark发现ping目标板的时候有数据返回。


问题解决:这里ping使用的是IP协议包裹的ICMP协议,这里网卡数据接收到之后再到LWip协议中分层,分别进行处理。这里ethernet_input()函数是注册的一个网卡数据接收分层函数的入口,再到ip_input(),最后进入到icmp_input(),这里再把数据接收到的ping包,做一个修改封装好数据再到底层网卡发送。ethernet_input()--->(MAC层)ip_input() (IP层) --->icmp_input()  (ICMP层)。这里我们把数据流向搞清楚也是我们发现问题的关键。这里我们把ping目标设备时候的接收包和发送包都打印出来了。对于底层具体数据最后我们通过比对可以成功ping通设备的数据发现,只有数据包的第37个字节和第38个字节不一样。这里成功的数据包为0000,而我的数据为554e。这里最后通过查询发现这两个字节的数据为ICMP的校验位。这里涉及到一个关键的宏定义  CHECKSUM_BY_HARDWARE  这里宏决定了LWip在发送数据包的时候使用软件校验还是硬件校验。如果定义了这个宏使用的是硬件校验这里校验码必须给0000。这里在STM32F107VCT6中 这个固件库函数便是打开硬件校验 ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable。这里最后我发现Lwip1.4.0的版本里面在icmp_input()这个函数里面没有关于这个宏的条件CHECKSUM_BY_HARDWARE ,这里比对其他版本都有一个关于这个宏定义的条件编译,具体操作是开了这个CHECKSUM_BY_HARDWARE 宏便把相关校验位清0  (iecho->chksum = 0)。由于移植过程中我按照其他人的文档来,但是我们Lwip和他们版本不同,打开了硬件校验宏,但是Lwip内部没有把这校验位清0导致数据不通过。下面给出我相关介绍的截图:


网卡数据入口:

关于Lwip移植-测试ping显示超时_第1张图片

ping数据打印比对:

关于Lwip移植-测试ping显示超时_第2张图片


Lwip相关代码修改:

关于Lwip移植-测试ping显示超时_第3张图片

Lwip是否开启硬件校验相关操作:

关于Lwip移植-测试ping显示超时_第4张图片


注意:所以这里应该是Lwip1.4.0的BUG,这个我们使用这个版本的协议栈需要关闭硬件校验才能通过PING,但是这样做会耗费硬件资源,所以这里我们按照其他版本做了一个宏的编译修复这个小BUG便可以通过了。这里简单通过ping发现使用软件校验的时间几乎没有差别,但是对于后期真正与服务器建立连接通信的过程中,随着数据量的增加肯定有影响,具体情况这里有待验证。

这里在你移植调试的过程中,如果你的网口指示灯或者网卡中断函数也没有进入,这里就要去检查你的MAC配置和PHY相关配置了。


上面的所讲都是个人理解,有错误的地方还希望大家给予建议和纠正。本人有个嵌入式交流群 469602418欢迎有兴趣的人可以加入遇到问题一起交流。



转载请注明原创人地址:谢谢




你可能感兴趣的:(Lwip,单片机,以太网,嵌入式,嵌入式Lwip—裸机学习)