fifofast:一套用 C 写的 FIFO(先进先出)缓冲区实现,CPU 占用极低,SRAM 占用最小

 

你是不是经常在单片机里写那一大堆环形缓冲区,代码又长又慢,调试时还老是卡?别慌,今天给大家掰开了聊聊 fifofast,一个专为低端 MCU 量身打造的超轻量 FIFO 库,省时省力还能省点 SRAM,真是“宇宙级”神器!


到底是个啥?

fifofast 是一套用 C 写的 FIFO(先进先出)缓冲区 实现,核心目标只有两点:

  1. 1. CPU 占用极低——几乎全靠位运算和 inline,ISR 里也能毫不卡顿;

  2. 2. SRAM 占用最小——每个 FIFO 只多 3 Byte 管理信息,数据本身直接放在静态数组里。

它不依赖任何动态内存,直接把缓冲区编译进代码,适配 AVR8、SAMG、SAML 等常见 MCU,几乎所有需要实时缓存的场景(串口、ADC、传感器数据)都能直接搬进去。


它解决了哪些痛点?

传统 FIFO 的烦恼

fifofast 的解决方案

占用太多 SRAM

(每个元素都要额外指针或结构)

只用 3 Byte 管理信息,数据直接存数组

ISR 里调用慢

(函数调用+分支)

全 inline、宏展开,几乎无函数调用开销

只能缓存单一类型

支持 任意数据类型(甚至自定义 struct)

缓冲区大小不灵活

(必须手动写环形逻辑)

自动使用 2ⁿ 大小环形缓冲,包装、取模全交给库

调试不友好

与 Atmel Studio 7 调试器深度集成,宏展开后仍可单步查看

简而言之,就是把“慢、占内存、难调试”这些老大难问题一锅端。


装上它、跑起来,只要三步

  1. 1. 下载源码:git clone https://github.com/nqtronix/fifofast.git(或者直接下载 ZIP 解压)。

  2. 2. 在工程里加头文件:把 fifofast.h 复制到你的项目目录,然后 #include "fifofast.h"。

  3. 3. 声明 & 初始化(下面是最小示例):

#include "fifofast.h"

// 声明一个容量为 16、元素类型为 int8_t 的 FIFO,名字叫 fifo_int8
_fff_declare(int8_t, fifo_int8, 16);

// 只在一个 .c 文件里初始化一次
_fff_init(fifo_int8);

int main(void)
{
    volatile int8_t tmp;

    // 写入 -42
    _fff_write(fifo_int8, -42);

    // 读取
    tmp = _fff_read(fifo_int8);   // tmp 现在是 -42

    while (1);
}

小技巧:如果要在 ISR 里使用,记得把 volatile 加到变量上,防止编译器优化掉。

进阶玩儿法:

  • • _fff_peek() 直接像数组一样随机访问任意位置;

  • • _fff_rebase() 把环形缓冲区“拔平”,方便直接交给字符串函数;

  • • 点式 FIFO(_fff_declare_p)和 FIFO 数组(_fff_declare_a)让你一次管理多个通道。


优缺点一目了然

优点

缺点

极低 CPU 占用,适合高频 ISR

只能使用 2ⁿ 大小的缓冲区(不足时会自动向上取整)

静态内存,无需 malloc/free

指针式 FIFO 需要手动类型转换,稍有风险

支持任意数据类型,灵活度高

宏展开会导致代码体积(Flash)比普通函数版略大

完全 inline,调试友好

对于非常大容量的 FIFO,SRAM 仍受限于 MCU 本身

总体来看,优点远大于缺点,尤其是对 资源受限的入门级 MCU,几乎是标配。


一句话总结

如果你在做 嵌入式实时数据(串口、ADC、传感器等),又担心 CPU 负载 和 内存紧张,fifofast 就是你的不二选择。它把“高效、通用、易调试”三大需求浓缩进一个几行宏里,让你把时间花在业务逻辑上,而不是底层缓冲区的琐碎实现。

赶紧去 GitHub 把代码克隆下来,改改自己的项目,感受下“秒级上手、毫秒响应”的快感吧!

项目地址: https://github.com/nqtronix/fifofast

 

发表评论