机器人车技术开发分享网
调试lwip通信用到的打印
  • 首页 > 单片机ARM系列
  • 作者:小v
  • 2015年1月6日 17:09 星期二
  • 浏览:2570
  • 字号:
  • 评论:2
  • 我们在分析lwIP协议栈的时候,会经常看到LWIP_DEBUGF()这个函数的身影。我想lwIP的作者可能为了便于人们去学习和使用lwIP而花了不少时间添加的。
    其实对于初学者来说,要把lwIP协议栈分析清楚不是一件容易的事情,尤其是对TCP/IP协议原理不是很了解的人。文件较多,函数较多,宏较多,调用关系相比一般的C程序来说较复杂。
    我个人认为,有些时候开启一下lwIP的调试信息输出功能,无论是对于我们学习还是查找以太网通信中的故障都是有帮助的。它能够lwIP协议栈中的一些内部函数调用关系,变量值,追踪信息等通过串口输出来。
    总之,
    1.可以查看函数的调用关系,跟踪程序流程。
    2.查看各种协议的调试信息,关键变量的值。
    3.通过以上掌握的很有针对性调试信息,我们可以以此为依据进一步地去优化我们的工程,保证各种资源的分配合理,了解到底是通信过程中的哪一个环节限制了网络的性能,然后加以改善。
     其实,我觉得lwIP协议栈的调试上,作者也是花了不少心思的。把要输出地调试信息分为按协议类型(TCP,UDP,ICMP,ARP....),调试信息类型(LWIP_DBG_TRACE,LWIP_DBG_STATE,LWIP_DBG_FRESH),调试信息级别(LWIP_DBG_LEVEL_OFF,LWIP_DBG_LEVEL_WARNING,LWIP_DBG_LEVEL_SERIOUS,LWIP_DBG_LEVEL_SEVERE)
    之所以要这么做,其实就是对要输出的调试信息有一个更好的管理,当我们开启调试功能后,只输出相关的调试信息,无关的信息就不要输出了。
    接下来以一个简单的例子,说一下,如何开启lwIP的调试功能。
    1.找到debug.h,添加下面这个define。
    #define LWIP_DEBUG
    #ifdef LWIP_DEBUG
    /** print debug message only if debug message type is enabled...
     *  AND is of correct type AND is at least LWIP_DBG_LEVEL
     */
    #define LWIP_DEBUGF(debug, message) do { \
                                   if ( \
                                       ((debug) & LWIP_DBG_ON) && \
                                       ((debug) & LWIP_DBG_TYPES_ON) && \
                                       ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \
                                     LWIP_PLATFORM_DIAG(message); \
                                     if ((debug) & LWIP_DBG_HALT) { \
                                       while(1); \
                                     } \
                                   } \
                                 } while(0)

    #else  /* LWIP_DEBUG */
    #define LWIP_DEBUGF(debug, message) 
    #endif /* LWIP_DEBUG */

    #endif /* __LWIP_DEBUG_H__ */


    2.在lwIPopts.h的debug options部分,按如下设置,要调试什么就把前边的“//”注释去掉即可。
    //*****************************************************************************
    //
    // ---------- Debugging options ----------
    //
    //*****************************************************************************
    #if 1
    #define U8_F "c"
    #define S8_F "c"
    #define X8_F "x"
    #define U16_F "u"
    #define S16_F "d"
    #define X16_F "x"
    #define U32_F "u"
    #define S32_F "d"
    #define X32_F "x"
    extern void UARTprintf(const char *pcString, ...);
    #define LWIP_PLATFORM_DIAG(x) {UARTprintf x;}
    #define LWIP_DEBUG
    #endif


    #define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_OFF
    //#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_WARNING
    //#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_SERIOUS
    //#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_SEVERE

    //#define LWIP_DBG_TYPES_ON               LWIP_DBG_ON
    #define LWIP_DBG_TYPES_ON               (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH)

    //#define ETHARP_DEBUG                    LWIP_DBG_ON     
    //#define NETIF_DEBUG                     LWIP_DBG_ON     
    //#define PBUF_DEBUG                      LWIP_DBG_ON
    //#define API_LIB_DEBUG                   LWIP_DBG_ON
    //#define API_MSG_DEBUG                   LWIP_DBG_ON
    //#define SOCKETS_DEBUG                   LWIP_DBG_ON
    //#define ICMP_DEBUG                      LWIP_DBG_ON
    //#define IGMP_DEBUG                      LWIP_DBG_ON
    //#define INET_DEBUG                      LWIP_DBG_ON
    #define IP_DEBUG                        LWIP_DBG_ON     
    //#define IP_REASS_DEBUG                  LWIP_DBG_ON
    //#define RAW_DEBUG                       LWIP_DBG_ON
    //#define MEM_DEBUG                       LWIP_DBG_ON
    //#define MEMP_DEBUG                      LWIP_DBG_ON
    //#define SYS_DEBUG                       LWIP_DBG_ON
    #define TCP_DEBUG                       LWIP_DBG_ON
    //#define TCP_INPUT_DEBUG                 LWIP_DBG_ON
    //#define TCP_FR_DEBUG                    LWIP_DBG_ON
    //#define TCP_RTO_DEBUG                   LWIP_DBG_ON
    //#define TCP_CWND_DEBUG                  LWIP_DBG_ON
    //#define TCP_WND_DEBUG                   LWIP_DBG_ON
    #define TCP_OUTPUT_DEBUG                LWIP_DBG_ON
    //#define TCP_RST_DEBUG                   LWIP_DBG_ON
    //#define TCP_QLEN_DEBUG                  LWIP_DBG_ON
    //#define UDP_DEBUG                       LWIP_DBG_ON     
    //#define TCPIP_DEBUG                     LWIP_DBG_ON
    //#define PPP_DEBUG                       LWIP_DBG_ON
    //#define SLIP_DEBUG                      LWIP_DBG_ON
    //#define DHCP_DEBUG                      LWIP_DBG_ON     
    //#define AUTOIP_DEBUG                    LWIP_DBG_ON
    //#define SNMP_MSG_DEBUG                  LWIP_DBG_ON
    //#define SNMP_MIB_DEBUG                  LWIP_DBG_ON
    //#define DNS_DEBUG                       LWIP_DBG_ON

    #endif /* __LWIPOPTS_H__ */


    3.当然通过串口输出的话,在main()函数里边还要初始化串口。
    4.通过以上三步基本就可以了,如果没有,看是否在用到>LWIP_DEBUGF()函数的C文件中,#include "lwip/debug.h",或者是include了包含此头文件的其它头文件,如opt.h。这是我调试打开一个网页时输出的调试信息:

    1.jpg

    这个可以用来检查协议栈中的内存分配情况,输出地调试信息可在配置lwipopts.h时作为参考。调试配置完成之后,

    可通过注释debug.h中的#define LWIP_DEBUG和lwipopts.h中的if 1改为if 0来关闭调试的输出。当然最后如果不用到串口的话,也可把串口的初始化相关代码去掉。

    通过上面的这个图片,不难看到,Http发送网页数据的一个过程:

    处理get请求

    寻找网页文件

    打开网页文件

    读取网页文件到文件缓冲区

    复制网页文件到RAM中的PBUF(如果网页不是存储在ROM中的话):tcp_write()

    把刚复制到RAM中的网页数据依据设置的MSS大小分成分段(segment),放入到发送队列:tcp_enqueue()

    输出segmes:tcp_output,tcp_output_segment,(依照窗口大小)。

    调用tcp_sent()指定的http_sent()检查一下是否还有读取的文件数据未发送完。

    若都发送完了,关闭文件,关闭连接。

    在配置lwIP协议栈发送数据的时候,涉及到总内存大小的配置,发送缓冲区的大小,窗口的大小,队列的长度等等,如何更好地在这几个参数之间保持一个平衡,实现较快地速度,希望高手能指点一下。

    因为,我发现,这些参数并不是越大越好。

    还有,tcp_enqueue()把好几个segment排到了队列,tcp_output_segment却并不及时的发送出去,是拥塞窗口限制了吗?

     
      您阅读这篇文章共花了:  
    二维码加载中...
    本文作者:小v      文章标题: 调试lwip通信用到的打印
    本文地址:http://blog.cvosrobot.com/?post=53
    版权声明:若无注明,本文皆为“机器人车技术开发分享网”原创,转载请保留文章出处。

    已添加友链,请把www.wowotech.net加上,谢谢
    @wowo:嗯
    返回顶部| 首页| 手气不错| 捐赠支持| 自定义链接| 自定义链接| 自定义链接| 手机版本|后花园

    Copyright © 2014-2017 机器人车技术开发分享网   京ICP备14059411 Copyright 2014-2019 小v工作室 版权所有 All Rights Reserved

    sitemap