在轻量型嵌入式开发中,没有单独的日志信息库,所以通常需要开发者自己对调试打印信息进行封装,这样即方便调试,也方便后续查问题,可以用一个宏开关对齐全局控制。
首先可以根据宏定义定义不同需要打印的函数,此处仅做一个简单示例
#if 1
#define KERNEL_DEBUG_LOG(fmt,...)
#define KERNEL_DEBUG_LOG(fmt,...)
#else
#define KERNEL_DEBUG_LOG(fmt,...) do{ log_direct((33<<24), "[KERNEL]%d(%s)"fmt, __LINE__, __func__, ##__VA_ARGS__); }while(0)
#define DRIVER_DEBUG_LOG(fmt,...) do{ log_direct((33<<24), "[DRIVER]%d(%s)"fmt, __LINE__, __func__, ##__VA_ARGS__); }while(0)
#endif
另外就是在打印信息中,我们想要加入其他打印的信息,比如行号,函数名等等,但是又不想每写一句调试信息就写一边,就可以通过下面的方式,利用宏的可变参数实现。
注:笔者此处封装函数为:void log_direct(unsigned int info, const char *fmt, ...);
如果为printf的原型:int log_direct( const char *fmt, ...); 对宏定义中微调即可。
#define DRIVER_DEBUG_LOG(fmt,...) do{ log_direct((33<<24), "[DRIVER]%d(%s)"fmt, __LINE__, __func__, ##__VA_ARGS__); }while(0)
如果有需求,还可以在宏中定义一个输出等级,do{}while(0)中判断一下输出等级再决定是否输出调试信息。当然如果打印信息比较多,这样写编译出的code字段会占很大的空间。
如代码段一,用宏去简单粗暴的定义,定义后编译后显示的占的空间很小,会直接被优化掉。
另外其他宏及可变参数的相关的知识就不再赘述了。