lwip 中日志信息输出软件实现分析


日志输出是 层序必须可少的。lwip 中,在保持软件可移植性的同时,是怎么实现 日志机制的?


arch.h【cc.h】 提供 platform 实现 衔接

参考 lwip 移植到新平台指南

https://www.cnblogs.com/zhangzhiwei122/p/15871026.html

cc.h 需要提供

  • LWIP_PLATFORM_DIAG(x) - non-fatal, print a message. Uses printf formating.
  • LWIP_PLATFORM_ASSERT(x)


arch.h 作为cc.h 引入lwip的唯一入口【只在 arch.h 中 include arch/cc.h 】,

如果cc.h 中没有 定义 这两个宏,则它会自己 定义这两个宏【作为fallback 实现】【这个fallback 实现,依赖 printf 函数】


debug.h - lwip 的日志机制接口

功能接口

LWIP_ERROR(message, expression , handler )

如果 expression 为true,则调用 LWIP_PLATFORM_DIAG 输出信息,并且执行 handler


LWIP_ASSERT(message, assertion) 

如果定义了 LWIP_NOASSERT 则 接口为空,否则调用  LWIP_PLATFORM_ASSERT


LWIP_DEBUGF(debug, message )

如果没有定义 LWIP_DEBUG宏,则接口为空,否则调用  LWIP_PLATFORM_DIAG 输出信息


LWIP_DEBUGF 深入

1、源码级别 有没有 编译 debug 相关的代码,被 LWIP_DEBUG宏 控制

2、在LWIP_DEBUG 宏为 1 的情况下,各个模块可以自己配置  LWIP_DEBUGF 时,填入的第一个参数【 在lwipopts.h 或 lwip/opt.h 中】决定本模块 调试信息是否输出。

示例,以 etharp.c 模块为例, opt.h 中年定义 了 ETHARP_DEBUG 为 0

#define LWIP_DEBUG                  0

#define ETHARP_DEBUG                LWIP_DBG_OFF
#define NETIF_DEBUG                 LWIP_DBG_OFF

etharp.c 中,使用 ETHARP_DEBUG 作为 LWIP_DEBUGF 调用的第一个 参数

1644306513

3、LWIP_DEBUGF 第一个参数,一个字节 的格式

1644312706(1)


开关 预定义宏

#define LWIP_DBG_ON            0x80U
#define LWIP_DBG_OFF           0x00U


类型  预定于宏

#define LWIP_DBG_TRACE         0x40U
#define LWIP_DBG_STATE         0x20U
#define LWIP_DBG_FRESH         0x10U
#define LWIP_DBG_HALT          0x08U


level 预定义宏

#define LWIP_DBG_LEVEL_ALL     0x00
#define LWIP_DBG_LEVEL_WARNING 0x01
#define LWIP_DBG_LEVEL_SERIOUS 0x02
#define LWIP_DBG_LEVEL_SEVERE  0x03


#define LWIP_DBG_MASK_LEVEL    0x03

#define LWIP_DBG_LEVEL_OFF     LWIP_DBG_LEVEL_ALL


LWIP_DEBUGF 对传入的 第一个参数,判断3个条件:

1、开关位 为 1

2、类型位 &  LWIP_DBG_TYPES_ON  不为 0

3、level 位 & LWIP_DBG_MASK_LEVEL >   LWIP_DBG_MIN_LEVEL


满足3个条件的,才进行  LWIP_PLATFORM_DIAG 输出信息

posted @ 2022-02-08 17:45  张志伟122  阅读(1111)  评论(0编辑  收藏  举报