void log_printf(const char * fmt, ...) {
char str_buf[128];
va_list args;
kernel_memset(str_buf, '\0', sizeof(str_buf));
va_start(args, fmt);
kernel_vsprintf(str_buf, fmt, args);
va_end(args);
// 显示,如果发送速度太慢,会造成这里关中断太长时间
// 所以,这里这样做不是好办法
mutex_lock(&mutex);
}
void kernel_vsprintf(char * buffer, const char * fmt, va_list args) {
enum {NORMAL, READ_FMT} state = NORMAL;
char ch;
char * curr = buffer;
while ((ch = *fmt++)) {
switch (state) {
// 普通字符
case NORMAL:
if (ch == '%') {
state = READ_FMT;
} else {
*curr++ = ch;
}
break;
// 格式化控制字符,只支持部分
case READ_FMT:
if (ch == 'd') {
int num = va_arg(args, int);
kernel_itoa(curr, num, 10);
curr += kernel_strlen(curr);
} else if (ch == 'x') {
int num = va_arg(args, int);
kernel_itoa(curr, num, 16);
curr += kernel_strlen(curr);
} else if (ch == 'c') {
char c = va_arg(args, int);
*curr++ = c;
} else if (ch == 's') {
const char * str = va_arg(args, char *);
int len = kernel_strlen(str);
while (len--) {
*curr++ = *str++;
}
}
state = NORMAL;
break;
}
}
}
printf的实现,va_list读取参数,vsprintf进行将%s,%d这些参数的值转化为字符串并一起输出到缓存区
最新推荐文章于 2025-06-01 03:06:32 发布