关于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导致数据不通过。下面给出我相关介绍的截图:


网卡数据入口:


ping数据打印比对:



Lwip相关代码修改:


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



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

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


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



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




  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lwIP(lightweight IP)是一个轻量级的TCP/IP协议栈,用于嵌入式系统中。移植lwIP协议栈可以使嵌入式设备具备网络通信能力。 在rt-thread操作系统中进行lwIP协议栈的移植可以实现网络通信的功能。其中的ping实验是一个常用的网络测试工具,用于测试网络连接是否正常。 移植lwIP协议栈之后,为了进行ping实验,需要进行以下几个步骤: 1. 配置网络参数:需要设置设备的IP地址、子网掩码和网关等参数,使设备能够与网络正常通信。 2. 创建ping应用程序:在rt-thread中,可以通过创建一个ping的应用程序来实现ping命令的功能。该应用程序会向指定的IP地址发送ICMP Echo Request包,并等待接收到相应的ICMP Echo Reply包。 3. 实现ping应用程序:在rt-thread中,可以使用lwIP提供的API函数来实现ping应用程序。需要创建一个线程,不断地向指定的IP地址发送ICMP Echo Request包,并等待接收到相应的ICMP Echo Reply包。 4. 解析ICMP Echo Reply包:当接收到ICMP Echo Reply包时,需要解析其中的字段,判断该包是否表示成功的ping应答。可以通过比较包的标识字段、序号字段和校验和字段等来判断应答的正确性。 通过以上步骤,lwIP协议栈在rt-thread操作系统中完成了ping实验的移植工作,可以通过ping命令来测试网络连接情况。实验结果将显示每次ping的延迟时间和成功率等信息,这些信息对于网络连接的调试和监测非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值