你是不是经常在单片机里写那一大堆环形缓冲区,代码又长又慢,调试时还老是卡?别慌,今天给大家掰开了聊聊 fifofast,一个专为低端 MCU 量身打造的超轻量 FIFO 库,省时省力还能省点 SRAM,真是“宇宙级”神器!
到底是个啥?
fifofast 是一套用 C 写的 FIFO(先进先出)缓冲区 实现,核心目标只有两点:
-
1. CPU 占用极低——几乎全靠位运算和 inline,ISR 里也能毫不卡顿;
-
2. SRAM 占用最小——每个 FIFO 只多 3 Byte 管理信息,数据本身直接放在静态数组里。
它不依赖任何动态内存,直接把缓冲区编译进代码,适配 AVR8、SAMG、SAML 等常见 MCU,几乎所有需要实时缓存的场景(串口、ADC、传感器数据)都能直接搬进去。
它解决了哪些痛点?
|
传统 FIFO 的烦恼 |
fifofast 的解决方案 |
| 占用太多 SRAM
(每个元素都要额外指针或结构) |
只用 3 Byte 管理信息,数据直接存数组 |
| ISR 里调用慢
(函数调用+分支) |
全 inline、宏展开,几乎无函数调用开销 |
| 只能缓存单一类型 |
支持 任意数据类型(甚至自定义 struct) |
| 缓冲区大小不灵活
(必须手动写环形逻辑) |
自动使用 2ⁿ 大小环形缓冲,包装、取模全交给库 |
| 调试不友好 |
与 Atmel Studio 7 调试器深度集成,宏展开后仍可单步查看 |
简而言之,就是把“慢、占内存、难调试”这些老大难问题一锅端。
装上它、跑起来,只要三步
-
1. 下载源码:
git clone https://github.com/nqtronix/fifofast.git(或者直接下载 ZIP 解压)。 -
2. 在工程里加头文件:把
fifofast.h复制到你的项目目录,然后#include "fifofast.h"。 -
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