lwprintf:一个为嵌入式系统打造的轻量级printf

有时候我们在做嵌入式开发,想用printf调试,但又怕占用太大内存、引入臃肿的stdio库;又或者想多路输出到不同设备上,却发现标准printf只能往一个流里吐数据。要是有个轻量、可重入、可多路输出,还兼容各种printf API 的小家伙,那就完美了。这篇文章,就跟大家唠一唠lwprintf——一个C11写的轻量级printf管理器,绝对能让你眼前一亮。

lwprintf是啥
简单说,lwprintf就是把printf、vprintf、snprintf、sprintf、vsnprintf这些常用函数搬到了一个更轻、更好控制的小屋里。

  • • 纯C11写成,对size_t、uintmax_t等做了兼容

  • • 只保留格式化输出的核心功能,没有冗余的locale、浮点(可选)

  • • 完全可重入,天生支持多线程环境

  • • 只需你自己实现一个“输出一个字符”的函数,就能跑起来

  • • 支持多条输出流:UART1、UART2、日志内存区……想咋分就咋分

  • • MIT许可证,随便商用、改造都没问题

它解决了哪些痛点
我们先来回顾一下,标准printf在嵌入式里常犯的“罪”:

  1. 1. 标准库太大,Flash、RAM 一下子暴增

  2. 2. 全局锁死,多个任务一起打日志就容易冲突

  3. 3. 只能输出到stdout,想同时往串口和日志环形缓冲区打?没门

  4. 4. 浮点、宽字符、复杂locale这些玩意儿在嵌入式里基本没用,却偏偏拖后腿

而lwprintf刚好对应地:

  • • 小:核心代码几十KB,编译选项还能再剔掉不需要的格式

  • • 快:只做必须的格式化操作,没有多余查表、切分、locale开销

  • • 灵活:可重入,多路输出,用户指定输出函数

  • • 干净:MIT 协议,一行强制条款都没有,让你改就改

核心特性一览

特性

说明

纯C11实现

对常见整数类型友好,嵌入式平台无障碍

printf/vprintf/…

支持一系列熟悉的API,替换成本极低

低内存占用

默认启用最少功能,几十KB即可满足大多数场景

可重入、多线程安全

可选操作系统钩子,打印时自动加锁解锁

用户自定义输出函数

只需实现 int lwprintf_out(int ch, lwprintf_t* ctx) 即可

多输出流

可以同时注册多个实例,按需输出到不同设备或缓冲区

扩展格式化

除了基础 %d、%u、%s,还添加了对 %b(二进制)、%t(布尔)等扩展支持

MIT 许可证

随便商用、随便开源、随便改,超友好

代码实战
下面贴个最简单的例子,让你一分钟上手:

#include "lwprintf/lwprintf.h"
#include <stdio.h>

/* 实现一个“每输出一个字符就调用一次”的函数 */
int lwprintf_out(int ch, lwprintf_t* lwp){
/* 这里先简单用标准库打印,实际用UART或其他设备 */
    if (ch !='\0'){
      putchar((char)ch);
      }
    return ch;
}

int main(void){
/* 初始化全局实例,绑定上面的输出函数 */
    lwprintf_init(lwprintf_out);

/* 和标准printf一样用 */
    lwprintf_printf("Hello, lwprintf! Decimal: %d, Hex: 0x%x, Bin: %b\n",123,123,123);
    return 0;
}

要用多输出流,只需再注册一个lwprintf_instance,并在初始化时传入不同的输出函数。就这么简单!

优缺点对比

类别

优点

缺点

功能

覆盖主流printf API;支持多流;用户高度自定义

默认不支持浮点(可选开启,但会增大体积)

体积

超轻量;可裁剪

若开启所有扩展格式化,代码量会增加

性能

只做格式化,不搞locale,速度快

在极端场景(超大格式串)下可能略慢于部分专用库

易用性

调用方式与标准库一致;MIT许可证无脑用

需要用户手动实现输出函数,对初学者有点门槛

可维护

代码结构清晰易读;文档齐全

只有英文文档,阅读起来稍微费点劲

总结
总的来说,lwprintf 就是为嵌入式和资源受限系统量身打造的轻量级printf解决方案。它保留了最常用的格式化功能,同时把内存占用和移植难度降到了最低。要在多任务、多设备场景下打印日志、调试信息,lwprintf绝对是你的不二之选。
别再纠结标准库的臃肿,把lwprintf拉进你的项目,秒变嵌入式打印小能手!

项目地址:https/github.com/MaJerle/lwprintf

发表评论