【LwIP源码学习2】调试输出相关宏

打开LWIP_DEBUG的打印信息调试 在lwip 2.1.2的版本,打开的debug 调试的步骤: 1.在debug.h 文件中找到debug打印的定义 默认LWIP_DEBUG这个宏没有定义, 2.在lwipopt.h 文件中或者其他文件定义 一下LWIP_DEBUG这个宏, 3.在opt.h 中可以打开各种宏的调试信息, /* --------------------------------------- ---------- Debugging options ---------- ---------... 阅读详情
AI摘要

本文对lwip中文件里的调试相关宏进行分析。debug.h中有3个重要的调试相关宏,包括断言、错误处理和调试打印。介绍了各宏的源码、展开情况及触发条件,还给出了相关例子。opt.h文件包含lwip所有调试标志,可通过设置开启或关闭调试打印。

前言

本文对lwip中debug.h文件里的调试相关宏进行分析。

正文

debug.h中有3个重要的调试相关宏:
LWIP_ASSERT(message, assertion)
LWIP_ERROR(message, expression, handler)
LWIP_DEBUGF(debug, message)

断言

LWIP_ASSERT(message, assertion)
源代码为:

#define LWIP_ASSERT(message, assertion) do { if (!(assertion)) { \
  LWIP_PLATFORM_ASSERT(message); }} while(0)

message为断言触发时输出的字符串,assertion为一个布尔值,展开后:

if (!(assertion))
{
	printf("Assertion \"%s\" failed at line %d in %s\n", 
		message, __LINE__, __FILE__); 
	fflush(NULL);  //更新文件系统
	abort();	   //程序中止运行
}

当判断条件不为真时,打印断言原因,输出断言所在文件名和文件中行数,更新文件系统 ,中止程序运行。
例子:

err_t
ethernetif_init(struct netif *netif)
{
    struct ethernetif *ethernetif;

    LWIP_ASSERT("netif != NULL", (netif != NULL));

    。。。。。。

    /* initialize the hardware */
    low_level_init(netif);

    return ERR_OK;
}

网卡初始化部分代码,当传入指针为空时,触发断言。

错误处理

LWIP_ERROR(message, expression, handler)
源码为:

#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
  LWIP_PLATFORM_ERROR(message); handler;}} while(0)

message为一段错误发生时输出的字符串,expression为错误判断条件,handler为一段代码,展开如下:

if (!(expression)
{
	printf(message);
	handler;
}

当判断条件不为真后,输出错误原因,执行错误处理代码handler。
例子:

err_t
netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local)
{
  API_MSG_VAR_DECLARE(msg);
  err_t err;

  LWIP_ERROR("netconn_getaddr: invalid conn", (conn != NULL), return ERR_ARG;);
  LWIP_ERROR("netconn_getaddr: invalid addr", (addr != NULL), return ERR_ARG;);
  LWIP_ERROR("netconn_getaddr: invalid port", (port != NULL), return ERR_ARG;);

  。。。。。。

  return err;
}

传入指针为空,打印错误原因,返回ERR_ARG错误码。

调试打印

LWIP_DEBUGF(debug, message)
源码为:

#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)

debug包含了多个用于控制调试行为的位标志。message是要调试打印的字符串。
展开后:

if (((debug) & LWIP_DBG_ON) && 
	((debug) & LWIP_DBG_TYPES_ON)) && 
	((signed short)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL))
{
	printf(message);
	if ((debug) & LWIP_DBG_HALT)
	{	
		while(1);
	}
}

其中:

#define LWIP_DBG_TYPES_ON               LWIP_DBG_ON
/** flag for LWIP_DEBUGF to enable that debug message */
#define LWIP_DBG_ON            0x80U
/** flag for LWIP_DEBUGF to disable that debug message */
#define LWIP_DBG_OFF           0x00U

可见LWIP_DBG_TYPES_ON与LWIP_DBG_ON是一样的,都是0x80U
当debug的第15位置1时,开启调试打印。

#define LWIP_DBG_MASK_LEVEL    0x03

表示debug的低两位是调式等级。

#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_ALL
/** Debug level: ALL messages*/
#define LWIP_DBG_LEVEL_ALL     0x00
/** Debug level: Warnings. bad checksums, dropped packets, ... */
#define LWIP_DBG_LEVEL_WARNING 0x01
/** Debug level: Serious. memory allocation failures, ... */
#define LWIP_DBG_LEVEL_SERIOUS 0x02
/** Debug level: Severe */
#define LWIP_DBG_LEVEL_SEVERE  0x03

表示有4个调试等级。
当debug低两位表示的调式等级高于LWIP_DBG_MIN_LEVEL时,开启调试打印。

#define LWIP_DBG_HALT          0x08U

表示当debug的第3为置1时,打印调试信息后,进入while循环中止程序运行。

在opt.h文件中包含了lwip所有的调试标志,如下:

#define ETHARP_DEBUG                    LWIP_DBG_OFF
#define NETIF_DEBUG                     LWIP_DBG_OFF
#define PBUF_DEBUG                      LWIP_DBG_OFF
#define API_LIB_DEBUG                   LWIP_DBG_OFF
#define API_MSG_DEBUG                   LWIP_DBG_OFF
#define SOCKETS_DEBUG                   LWIP_DBG_OFF
。。。。。。

表示这些调试打印都关闭了,如果把LWIP_DBG_OFF换成LWIP_DBG_ON则开启对应的调试打印。

例子:

err_t
ethernetif_init(struct netif *netif)
{
    struct ethernetif *ethernetif;

    ethernetif = mem_malloc(sizeof(struct ethernetif));
    
    if (ethernetif == NULL)
    {
        LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory\n"));
        return ERR_MEM;
    }

	。。。。。。

    return ERR_OK;
}

当opt.h文件中NETIF_DEBUG宏定义为LWIP_DBG_ON时,则运行到这里时打印后面的字符串。

LWIP TCP发送数据时间间隔过短导致LWIP DEBUG报错----解决方法;LWIP TCP如何以较短时间间隔发送数据?(STM32) 阅读详情

相关推荐

lwIp源码解析--DHCPv4

lwip源码解析–DHCPv4 一、简介    1.1 lwip版本    lwip 2.1.2    1.2 代码范围    在lwip中包含了DHCPv4客户端的实现,文件路径: lwip-2.1.2\src\core\ipv4\dhcp.c lwip-2.1.2\src\include\lwip\dhcp.h    文件代码两千行左右,阅读难度不大。 二、DHCPv4流程和状态机 三、DHCPv4源码    3.1 启动客户端 err_t dhcp_s.

chenlonglong2014的博客 2300

关于开启lwIP协议栈的调试输出LWIP_DEBUGF

我们在分析lwIP协议栈的时候,会经常看到LWIP_DEBUGF()这个函数的身影。我想lwIP的作者可能为了便于人们去学习和使用lwIP而花了不少时间添加的。 其实对于初学者来说,要把lwIP协议栈分析清楚不是一件容易的事情,尤其是对TCP/IP协议原理不是很了解的人。文件较多,函数较多,宏较多,调用关系相比一般的C程序来说较复杂。 我个人认为,有些时候开启一下lwIP的调试信息输出功能,无...

移动开发记录 2912

LWIP之Memp原理

前言 在这个色彩缤纷的时代,网络扮演着重要的角色,作为网络通讯的主要协议,TCP/IP协议就变得非常的重要,对于嵌入式系统来说,处理能力以及内存上的瓶颈导致嵌入式TCP/IP协议栈不可能像PC上的协议栈那么强大,而LWIP作为一个小型的开源免费的TCP/IP协议栈,以简洁,高效,占用内存少被广泛的使用在各类嵌入式网络应用中,本文就是基于LWIP的内存角度开展的。 正文 ...

3501

LwIP调试输出

LwIP调试输出有3个开关: LWIP_DBG_ON:总开关 LWIP_DBG_TYPES_ON:类型开关 LWIP_DBG_MIN_LEVEL:等级开关 LWIP_DBG_TYPES_ON和LWIP_DBG_MIN_LEVEL是在lwipopt.h由用户定义的 一个调试类型的debug值可以是这样形式定义的: LWIP_DBG_ON | LWIP_DBG_TYPES_ON | LWIP

swyang1992的专栏 4358

uboot移植LWIP实现FTP下载文件

本文主要介绍了如何在uboot基于LWIP协议栈实现对FTP功能的支持

qq_30781193的博客 3395

TCP/IP协议栈之LwIP(十一)--- LwIP协议栈移植

一、移植环境准备 前面主要是基于QEMU虚拟机环境进行LwIP协议栈开发调试的,如果手头没有开发板可以先在个人电脑上运行QEMU虚拟机以便学习LwIP协议栈的实现原理或者开发调试过程。在实际产品中,就需要在真实的开发板上移植LwIP协议栈,并在此基础上进行开发调试了。 1.1 IoT-OS准备 现在物联网设备越来越需要操作系统支持,所以本文在有操作系统的基础上移植LwIP协议栈,选择的操作系统环境...

流云 6509

LwIP协议栈浅析

一、LwIP简介 LwIP(Light weight IP)是一种轻量级的TCP/IP协议栈,其设计初衷是用少量的资源消耗实现一个较为完整的TCP/IP协议栈,有无操作系统均可运行。LwIP 具有主要特性: 1. 支持 ARP 协议(以太网地址解析协议)。 2. 支持 ICMP 协议(控制报文协议),用于网络的调试与维护。 3. 支持 IGMP 协议(互联网组管理协议),可以实现多播数据的接收。 4. 支持 UDP 协议(用户数据报协议)。 5. 支持 ...

高原 1万+

lwIP TCP/IP 协议栈笔记之一:概述和目录结构详解

目录 1. lwIP概述 1.1 TCP/IP 协议简介 1.2 lwIP 简介 1.2.1 目录结构 lwip-2.1.2 1.2.2 lwip-2.1.2/src 2 目录结构详解 2.1 /doc 2.2 /test 2.3 /src 2.3.1 APIs 2.3.2 /src/api 2.3.3 /src/apps 2.3.4 /src/core 2.3.5 /...

Xanthium 1万+

LWIP源码移植

本文笔者主要讲述LwIP源码的文件分布和在芯片的中间组件上移植。

火山宝 && 王林宝 2338

别光看协议栈!手把手带你拆解LwIP 2.1.2源码目录,搞懂每个文件是干嘛的

本文深入解析LwIP 2.1.2源码目录结构,详细讲解每个核心文件的功能及协议栈工作原理。从pbuf数据包管理到TCP状态机实现,提供嵌入式开发中的实战调试技巧和性能优化方法,帮助开发者高效掌握轻量级TCP/IP协议栈的底层机制与应用实践。

weixin_30785593的博客 168

FreeRTOS v10.2.1下LwIP移植实战:从源码集成到网络连通

本文详细介绍了在FreeRTOS v10.2.1环境下进行LwIP移植的实战步骤,从源码集成到网络连通的全过程。通过具体的配置示例和性能优化技巧,帮助开发者快速实现嵌入式设备的网络功能,适用于物联网和嵌入式系统开发。

weixin_30417487的博客 538

lwip简介及基础知识

简介 1、 介绍 LwIP 全名:Light weight IP,意思是轻量化的 TCP/IP 协议,是瑞典计算机科学院 (SICS) 的 AdamDunkels 开发的一个小型开源的 TCP/IP 协议栈。 LwIP 的设计初衷是:用少量的资源消耗实现一个较为完整的 TCP/IP协议栈,其中“完整”主要指的是 TCP 协议的完整性,实现的重点是在保持 TCP 协议主要功能的基础上减少对 RAM 的占用。 此外 LwIP 既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。 2、支持的协议

chengcao123的博客 1万+

LWIP

官网原文件包内容 doc文件夹下的rawapi.txt是告诉读者怎么使用API编程,raw/callback API是协议栈提供的三种编程接口中最复杂的一种。 sys_Arch.txt在移植时被用到,它里面包含了移植说明,规定移植者需要实现的函数、宏定义等。test文件夹是LwIP提供的一些协议栈内核测试程序。src文件夹是协议栈内核的所有源代码。src其中包括4部分,api文件夹包含了sequ

u010947693的博客 2738

基于STM32H750的LWIP调试,PC作为服务端,单片机作为客户端

首先,最最最重要的就是你的硬件部分是好的,本人因为是项目需求,所以以太网的部分是自己参考买的一个板子上的以太网进行设计的,在设计部分出了一些错误(网口的晶振没有起振,PHY芯片某个引脚的下拉电阻阻值不对),导致我一直认为是软件的错误,从而浪费了很多的时间,所以第一步就是确认以太网部分的硬件是正确的。因为我用CubeMX里自带的LWIP,生成的代码一直调不通,所以我选择了手动移植LWIP的源文件,这里配置好之前的ETH,然后再打开一个USART串口方便后面进行调试,就可以直接生成代码了。

jk__love_的博客 3103

2019年电赛D题《简易电路特性测试仪》全过程

2019年全国大学生电子设计大赛D题《简易电路特性测试仪》硬件部分及故障分析

zzhao2580的博客 5万+

缺陷检测-金属表面缺陷检测

1介绍 缺陷检测是工业视觉技术中最重要的组成部分。业务广泛,场景丰富,技术难点高、工作量大。针对不同的场景,选择不同的相机和

huneng1991的专栏 5250

篇六 lwip 相关介绍

lwip协议栈相关介绍

苏州向日葵的博客 1067

从零到一:用STM32 FOC算法驯服无刷电机的艺术

本文详细介绍了如何使用STM32和FOC算法实现无刷电机的高性能控制。从硬件搭建、参数识别到闭环调节,一步步解析FOC算法的核心原理与调优技巧,帮助开发者掌握电机控制的关键技术,实现从零到一的精准驯服。

kkk56的博客 919

解决在windows平台调试lwip协议中时使用MinGW-W64工具链链接源码过程中遇到部分库函数引用失败问题

主要解决在windows平台使用MinGW-64编译lwip协议栈遇到部分静态库中函数链接失败的问题。

LHC_黎明之光的博客 1171

Evolution of Heuristics: Towards Efficient Automatic Algorithm Design Using Large Language Model

启发式算法广泛用于处理复杂的搜索和优化问题。然而,启发式算法的手动设计通常非常耗费人力,需要丰富的工作经验和知识。本文提出了启发式算法的进化 (EoH),这是一种新颖的进化范式,它利用大型语言模型 (LLM) 和进化计算 (EC) 方法进行自动启发式设计 (AHD)。EoH 代表自然语言中的启发式概念,称为思想。然后由 LLM 将它们转换为可执行代码。进化搜索框架中思想和代码的演变使其在生成高性能启发式算法方面非常有效和高效。

weixin_43961909的博客 2162

影刀RPA:轻松搞定Excel表格自动化操作

影刀RPA是一款功能强大的自动化工具,通过模拟人类操作实现各种重复性任务的自动化。零代码操作:通过拖拽式流程设计器,无需编程基础即可快速上手。功能丰富:提供丰富的组件库,涵盖文件操作、数据处理等多种功能。高效稳定:支持多任务并行,确保任务的高效执行和稳定性。支持Python语法:内置数据表格,支持Python语法,对新手友好,同时具备循环功能。通过影刀RPA,您可以轻松实现Excel表格的拆分、列数据合并和归档工作的自动化。这不仅节省了手动操作的时间,还能确保数据处理的高效和准确,提升工作效率和管理水平。

watwrmoon的博客 2560

LwIP相关博文

文章目录

山音水月 401

2. Android_逆向的历史与发展

学完本节,希望你能够:了解 Android 逆向工程的发展历程,从早期 APK 破解到现代应用保护;入门先把这几类「在干啥」搞清楚,后面学脱壳、反反调试会顺很多。(反编译 APK 得到的类汇编代码,相当于程序的「菜谱」)就能绕过验证,到后来混淆、加固、反调试一起上,逆向难度越来越高。(第三节 什么是 CPU 指令集),帮你搞清楚「反汇编看到的那些指令」是从哪来的、和 Android 逆向有啥关系。有必要——先搞清「没加固时怎么玩」,再学脱壳和对抗,思路才顺。读起来费劲,但逻辑还在,耐心一点还能跟。

长沙火山 1390

LwIP协议栈学习指南

LwIP协议栈学习指南摘要 LwIP是轻量级TCP/IP协议栈,适用于嵌入式系统开发。该指南分为三部分:1)基础认知:讲解TCP/IP四层模型(链路层、网络层、传输层、应用层)和嵌入式网络硬件(以太网控制器、WiFi模块等);2)环境搭建:介绍移植准备工作、关键配置修改、编译设置及ping例程调试;3)API实战:详细说明Socket API实现,提供TCP服务器和UDP客户端的代码示例。通过学习可掌握LwIP协议栈的核心原理、移植方法和实际应用技巧,适用于嵌入式网络开发人员。

淼淼的博客 | Miaomiao_IoT 1905

【第三方互联】3、腾讯QQ授权第三方登录

当我们创建的 QQ 互联应用成功后,我们便可以开始使用该应用来实现 QQ 互联 一、获取 APP ID 和 APP Key 1、找到我的应用 2、点击应用,进入详情 这样,我们就获取到了 APP ID 和 APP Key 二、进行开发 1、将 APP ID 、APP Key,以及该应用的信息放入项目中的配置文件中,我使用的是SpringBoot,我放在了 application.y...

JACKAL 22万+

ICC2:使用analyze_lib_cell_placement检查lib cell的pass rate

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?在place之前需要使analyze_lib_cell_placement命令去检查lib cell在当前的site row/power plan/legalize设置的环境下能够正常place和legalize。下面分享一个脚本去报告pass rate低于2%的lib cell。

m0_61544122的博客 675
上一篇: 【开源项目赏析】遥控四旋翼直升机项目——MiniQ
下一篇: 【LwIP源码学习3】TCP协议栈分析——数据接收流程
inputA
博客等级 码龄7年 297粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值