emio:一个专为裸机(bare-metal)和 RTOS 嵌入式系统设计的,“即安全又快速”的高低层字符输入/输出库

什么是 em)io?
简单来说,emio是一个“安全又快速”的高低层字符输入/输出库,专为裸机(bare-metal)和 RTOS 嵌入式系统设计。它最大的亮点:二进制体积超小(比流行的 fmtlib 小了约 38 倍),无需堆,C++20 支持,既能高层次格式化,也能低层次逐字符操作。

它能帮你做什么?

  • • 格式化输出:和 fmt::format 类似,用 emio::format("Hello, {}!", name) 拼字符串;

  • • 安全扫描:用 emio::scan 把字符串中的数字或文本读出来,不抛异常,返回 result 对象;

  • • 无堆栈静态缓冲:emio::static_buffer<128>,全程无 new/delete;

  • • 底层读写:writer.write_int(42)、reader.parse_int<uint32_t>(),直接面向字节和字符。

解决了哪些痛点?
嵌入式开发常见的 I/O 库,不是体积太大,就是不安全(抛异常、需要堆),或者性能不够。emio 主要解决了:

  • • 体积焦虑:固件空间宝贵,用 fmtlib 那堆模板和异常,会把镜像撑大;

  • • 实时性需求:裸机/RTOS 环境里,不允许在中断里抛异常;

  • • 零依赖:不依赖标准库的堆、锁等,适合各种微控制器;

  • • 一套搞定:既要高阶格式化,也要分字节读写,一次性满足。

快速对比:emio vs fmtlib

特性

emio

fmtlib

二进制体积

≈38 倍更小

较大

异常机制

返回 result,无异常

默认抛异常

堆依赖

无

根据编译选项有或无

高/低层 API

高层 format + 低层 reader/writer

主要高层 format

编译期支持

constexpr

 友好

较友好

使用场景展示

// 高层:格式化 & 扫描
std::string s = emio::format("温度:{}℃",25);
int temp{};
if(emio::scan(s,"温度:{}℃", temp)){
    emio::print("当前温度:{}℃\n", temp);
}

// 无堆栈静态缓冲
emio::static_buffer<64> buf;
emio::format_to(buf,"电压:{:.2f}V",3.3).value();
buf.view();// -> 电压:3.30V

// 低层:逐字符写入
emio::writer wrt{buf};
wrt.write_str(" 状态:").value();
wrt.write_int(1).value();// 1 表示正常
wrt.write_char('\n').value();
buf.view();

优缺点一览

优点

缺点

极小的二进制体积

功能聚焦,缺少高级格式功能(如自定义格式化)

无堆依赖、无异常抛出

社区生态和教程相比 fmtlib 还在成长

同时支持高层和底层 API

文档尚在完善中,设计文档需深入研究

C++20 编译期友好

目前处于 beta 状态

总结
总之,如果你正在做 裸机/RTOS 嵌入式开发,特别是对固件体积敏感、不能用异常、又想要现代 C++ 格式化和扫描能力,emio 真的是一个轻量级且“贴地气”的好选择。它帮你把常见的字符 I/O 问题都包起来,既能高层简单用,关键时候也能下到字节级操作。虽然还在 beta,生态和文档都需要大家一起“添砖加瓦”,但它的方向和目标都很明确:小、快、安全、零依赖。

项目地址:https://github.com/Viatorus/emio

发表评论