lwip 中日志信息输出软件实现分析
日志输出是 层序必须可少的。lwip 中,在保持软件可移植性的同时,是怎么实现 日志机制的?
arch.h【cc.h】 提供 platform 实现 衔接
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 调用的第一个 参数
3、LWIP_DEBUGF 第一个参数,一个字节 的格式
开关 预定义宏
#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 输出信息