diff --git a/src/kernel/lib/print.c b/src/kernel/lib/print.c index b84cd1ca3e0d230803406139a124340eca2ea48e..770f7c1f1f7412f40fd83769a27b3d8126deefc3 100644 --- a/src/kernel/lib/print.c +++ b/src/kernel/lib/print.c @@ -59,7 +59,56 @@ static void printptr(uint64 x) */ void printf(const char *fmt, ...) { - + va_list args; + va_start(args, fmt); + spinlock_acquire(&print_lk); // 加锁,保证UART资源的独占访问 + // 遍历格式字符串 + while (*fmt) { + if (*fmt != '%') { + uart_putc_sync(*fmt); + fmt++; + continue; + } + fmt++; + switch (*fmt) { + case 'd': { + int num = va_arg(args, int); + printint(num, 10, 1); + break; + } + case 'p': { + uint32_t ptr = va_arg(args, uint32_t); + printptr(ptr); + break; + } + case 'x': { + uint64_t num = va_arg(args, uint64_t); + printptr(num); + break; + } + case 'c': { + char ch = va_arg(args, int); + uart_putc_sync(ch); + break; + } + case 's': { + char *str = va_arg(args, char*); + while (*str) { + uart_putc_sync(*str); + str++; + } + break; + } + default: + // 处理未知格式说明符 + uart_putc_sync('%'); + uart_putc_sync(*fmt); + break; + } + fmt++; + } + va_end(args); + spinlock_release(&print_lk); } @@ -79,5 +128,7 @@ void panic(const char *s) /* 如果不满足条件, 则调用panic */ void assert(bool condition, const char *warning) { - + if (!condition) { + panic(warning); + } }