我们在分析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。
转载自;http://bbs.eeworld.com.cn/thread-226628-1-1.html
分享到:
相关推荐
LwIP协议栈的设计与实现_中文译稿.pdf,高质量,,页数 42
LwIP协议栈的设计与实现_中文译稿.zip
LwIP协议详解.pdf LwIP协议栈的设计与实现_中文译稿.pdf lwip源码详解_狗拿耗子.pdf uCOS平台下的LwIP移植笔记.pdf
LwIP协议栈的设计与实现_中文手册文档,非常好的参考手册
LWIP 协议栈的设计与实现, 中文版,仅供学习,未经作者许可不得用于商业用途
LWIP嵌入式协议栈详解,包含TCP/UDP/SLEVER模式,简介好用
LwIP协议栈的设计与实现_中文译稿 轻量级的TCP/IP协议栈,应用于嵌入式系统
至2018.07.19最新的LWIP官方协议栈,在apps文件中包含目前物联网最流行的网络协议MQTT,在学习作为轻量级的网络协议栈同时还能作为MQTT的项目进行开发
Lwip协议栈是嵌入式中最常用的协议栈,本资源可以包括LwIP协议栈的设计与实现_中文 与 LwIP协议栈源码详解资料。
摘要LwIP 是 TCP/IP 协议栈的一个实现。它的目的是减少内存使用率和代码大小,使 LwIP 适用于资源受限系统比如嵌入式系统。为了减少处理和内存需求,L
经典的LWIP嵌入式开发书籍,适合对TCP/IP的入门学习,并进行嵌入式TCP/IP协议栈的移植及开发。
LwIP协议栈源码详解.pdf
lwip协议栈源码详解.pdf 里面详细的解绍了LwIP协议栈的工作原理,内存分配方式,接口管理,常见的网络协议
老衲五木的LwIP协议栈源码详解 -TCP/IP 协议的实现
LwIP协议栈的设计与实现,高清中文版,解压后打开.......
lwip是瑞典计算机科学院的一个开源的TCP/IP协议栈实现. lwIP是TCP/IP协议栈的一个实现。lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了...