用于跟踪系统运行状态、错误和其他关键事件
#if LOG_EN
#ifdef __KERNEL
#include <linux/kernel.h>
#include <linux/module.h>
#define log_p printk
#elif defined(_wangyue)
#include <hal.h>
#define log_p printf
int sprintf( char * buf, const char * fmt, ... );
#elif defined(__wangyue2)
#include "common.h"
#include <string.h>
#define log_p wangyue_printf
#undef memcpy
#define memcpy wangyue_memcpy
#undef memset
#define memset wangyue_memset
#else
#include <stdio.h>
#include <string.h>
#define log_p printf
#endif
#define __FILE_NAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#define log_h(level, title, data, len) do { \
char _buf[64], *_dat=(char*)(data); unsigned int _ofs=0, _len=len; \
log_p("[%s:%d][%s][%d][%s]%c", __FILE_NAME__, __LINE__, #level, _len, title, _len>16?'\n':' '); \
if(NULL==_dat || 0==_len) { log_p("\n"); break; } \
if(_len > 256) _len = 256; \
for(int i=1; i<=_len; i++,_dat++) { \
_ofs += sprintf(_buf+_ofs, "%02x ", (*_dat)&0xff); \
if(0==i%16) { log_p("%s\n", _buf); _ofs=0; } \
else if(0==i%4) { *(_buf+_ofs)=' '; _ofs++; }} \
if(_ofs) { _buf[_ofs]='\0'; log_p("%s\n", _buf); }} while(0)
#else
#define log_h(str, ...) ((void)0)
#define log_p(str, ...) ((void)0)
#endif
#if LOG_EN_ERROR
#define log_e(str, ...) log_p("[%s:%d][E] " str " \n", __FILE_NAME__, __LINE__, ##__VA_ARGS__)
#define log_eh(title, data, len) log_h(E, title, data, len)
#define log_ep log_p
#else
#define log_e(str, ...) ((void)0)
#define log_eh(str, ...) ((void)0)
#define log_ep(str, ...) ((void)0)
#endif
#if LOG_EN_WARNING
#define log_w(str, ...) log_p("[%s:%d][W] " str " \n", __FILE_NAME__, __LINE__, ##__VA_ARGS__)
#define log_wh(title, data, len) log_h(W, title, data, len)
#define log_wp log_p
#else
#define log_w(str, ...) ((void)0)
#define log_wh(str, ...) ((void)0)
#define log_wp(str, ...) ((void)0)
#endif
#if LOG_EN_INFO
#define log_i(str, ...) log_p("[%s:%d][I] " str " \n", __FILE_NAME__, __LINE__, ##__VA_ARGS__)
#define log_ih(title, data, len) log_h(I, title, data, len)
#define log_ip log_p
#else
#define log_i(str, ...) ((void)0)
#define log_ih(str, ...) ((void)0)
#define log_ip(str, ...) ((void)0)
#endif
#if LOG_EN_DBUGE
#define log_d(str, ...) log_p("[%s:%d][D] " str " \n", __FILE_NAME__, __LINE__, ##__VA_ARGS__)
#define log_dh(title, data, len) log_h(D, title, data, len)
#define log_dp log_p
#else
#define log_d(str, ...) ((void)0)
#define log_dh(str, ...) ((void)0)
#define log_dp(str, ...) ((void)0)
#endif