os_util.c 源码
2026/7/20大约 2 分钟源码参考内核工具函数格式化
os_util.c — 内核工具函数
源文件路径: kernel/source/os_util.c
引用章节: 4.6 错误处理机制
核心机制
os_util.c 提供了 OneOS 内核自实现的格式化字符串函数,不依赖 C 标准库,确保内核在任何环境下都能独立运行:
os_vsnprintf:核心格式化引擎,支持%d/%x/%s/%c/%p等格式os_snprintf:os_vsnprintf的 va_list 封装os_kprintf:内核打印函数,通过os_hw_console_output输出
完整源码(关键部分)
/**
***********************************************************************************************************************
* Copyright (c) 2020, China Mobile Communications Group Co.,Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); ...
*
* @file os_util.c
* @brief This file provides some utility functions similar to C library,
* so kernel does not depend on any C library.
***********************************************************************************************************************
*/
#include <oneos_config.h>
#include <os_stddef.h>
#include <arch_interrupt.h>
#include <string.h>
#include <board.h>
/* ==================== 格式化标志 ==================== */
#define ZEROPAD (1 << 0) /* 零填充 */
#define SIGN (1 << 1) /* 有符号 */
#define PLUS (1 << 2) /* 显示+号 */
#define SPACE (1 << 3) /* 空格前缀 */
#define LEFT (1 << 4) /* 左对齐 */
#define SPECIAL (1 << 5) /* 0x/0X 前缀 */
#define LARGE (1 << 6) /* 大写字母 */
/* 数字转字符串(核心函数) */
static char *print_number(char *buf, char *end, long long num, int base,
int width, int precision, int type)
{
/* 支持 2/8/10/16 进制,处理符号、宽度、精度、对齐 */
/* ... 约 200 行实现 ... */
}
/**
* @brief 格式化字符串到缓冲区(自实现,不依赖 C 库)
* @param buf 输出缓冲区
* @param size 缓冲区大小
* @param fmt 格式化字符串
* @param args 可变参数
* @return 实际写入长度(不含 '\0')
*/
int32_t os_vsnprintf(char *buf, os_size_t size, const char *fmt, va_list args)
{
/* 支持格式:
* %c - 字符
* %s - 字符串
* %d/%i - 有符号整数
* %u - 无符号整数
* %x/%X - 十六进制
* %o - 八进制
* %p - 指针
* %% - 百分号
* 修饰符:h/l/ll/z, 宽度, 精度, -/+/ /#/0 标志
*/
/* ... 约 350 行实现 ... */
}
/**
* @brief 格式化字符串到缓冲区(va_list 封装)
*/
int32_t os_snprintf(char *buf, os_size_t size, const char *fmt, ...)
{
int32_t n;
va_list args;
va_start(args, fmt);
n = os_vsnprintf(buf, size, fmt, args);
va_end(args);
return n;
}
/**
* @brief 内核打印函数
* 通过 os_hw_console_output() 输出到控制台
* SMP 下使用自旋锁保护
*/
#ifdef OS_DEBUG
void os_kprintf(const char *fmt, ...)
{
va_list args;
os_size_t length;
static char log_buff[OS_LOG_BUFF_SIZE];
os_ubase_t irq_save;
#ifdef OS_USING_SMP
os_spin_lock_irq(&gs_kprintf_lock, &irq_save);
#else
irq_save = os_irq_lock();
#endif
va_start(args, fmt);
length = os_vsnprintf(log_buff, sizeof(log_buff), fmt, args);
if (length > sizeof(log_buff) - 1)
length = sizeof(log_buff) - 1;
va_end(args);
os_hw_console_output(log_buff);
#ifdef OS_USING_SMP
os_spin_unlock_irq(&gs_kprintf_lock, irq_save);
#else
os_irq_unlock(irq_save);
#endif
}
#else
void os_kprintf(const char *fmt, ...)
{
/* 非调试模式:空函数 */
}
#endif /* OS_DEBUG */关键说明
| 函数 | 特点 | 说明 |
|---|---|---|
os_vsnprintf | 自实现 | 不依赖 libc,支持 ARM/GCC/IAR 三平台 |
os_kprintf | 中断安全 | SMP 下自旋锁保护,单核关中断保护 |
OS_LOG_BUFF_SIZE | 缓冲区 | 默认 128/256 字节,可配置 |