lk中的dprintf实现

在lk中我们一般通过dprintf来打印log,如下所示
dprintf(INFO, " 0x%x", t->tls[i]);
其中INFO表示log的级别,lk中总共有三种级别
/* debug levels */
#define CRITICAL 0
#define ALWAYS 0
#define INFO 1
#define SPEW 2


继续看dprintf的实现
#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0)
发现如果你要打印的级别小于DEBUGLEVEL,log才会被打印出来
#if defined(DEBUG)
#define DEBUGLEVEL DEBUG
#else
#define DEBUGLEVEL 2
#endif
可以看到如果没有定义DEBUG的话,DEBUGLEVEL 默认等于2,也就是所有的log都能印出来
_dprintf的实现如下:
int _dprintf(const char *fmt, ...)
{
char buf[256];
char ts_buf[13];
int err;


snprintf(ts_buf, sizeof(ts_buf), "[%u] ", current_time());
dputs(ALWAYS, ts_buf);


va_list ap;
va_start(ap, fmt);
调用vsnprintf来格式化字符串,例如本例中的0x%x表示以16进制的方式打印log
err = vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);


dputs(ALWAYS, buf);


return err;
}
log具体是调用dputs来印出来的,我们继续看看其实现
#define dputs(level, str) do { if ((level) <= DEBUGLEVEL) { _dputs(str); } } while (0)




向上面一样,也是要判断log level,继续调用 _dputs来印log,_dputs就是具体平台的实现了,我们看一个已经实现的例子。
int _dputs(const char *str)
{
while(*str != 0) {
_dputc(*str++);
}


return 0;
}
通过一个while 循环将字符串中的字符一个一个通过_dputc打印出来
void _dputc(char c)
{
*REG8(DEBUG_STDOUT) = c;
}
#define REG8(addr) ((volatile uint8_t *)(addr))
可以看到就是只要将字符串写到uart的寄存器中,hw就会自动将字符打印出来



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值