typedef struct {
uint8_t buffer[256]; // 存放数据(饭盒)
uint16_t write_index; // 写入指针(打饭窗口)
uint16_t read_index; // 读取指针(学生排队领饭)
uint16_t count; // 当前存放了多少数据(队伍长度)
} FIFO_t;
buffer[256]就是 256 个饭盒,用来存数据。
write_index负责装饭(存数据)。
read_index负责拿饭(取数据)。
count记录当前队伍里有多少人(存了多少数据)。
void fifo_init(FIFO_t *fifo) {
fifo->write_index = 0;
fifo->read_index = 0;
fifo->count = 0;
}
刚开始都清0
bool fifo_write(FIFO_t *fifo, uint8_t data) {
if (fifo->count == 256) return false; // 饭盒满了,不能再存数据
fifo->buffer[fifo->write_index] = data; // 把数据存入 FIFO
fifo->write_index = (fifo->write_index + 1) % 256; // 环形队列
fifo->count++;
return true;
}
这里唯一的难点就是环形的概念
write_index = 5;
write_index = (write_index + 1) % 256; // 变成 6
write_index = 254;
write_index = (write_index + 1) % 256; // 变成 255
write_index = 255;
write_index = (write_index + 1) % 256; // 变成 0(回到起点)
检查 FIFO 是否满了(饭盒是否装满了),满了就不能再写入。
写入数据后,写指针 write_index 往前移动,到下一个空位。队伍人数 count++,表示数据增加了。
bool fifo_read(FIFO_t *fifo, uint8_t *data) {
if (fifo->count == 0) return false; // 队伍没人,无法取数据
*data = fifo->buffer[fifo->read_index]; // 取出 FIFO 里的数据
fifo->read_index = (fifo->read_index + 1) % 256; // 环形队列
fifo->count--;
return true;
}
如果 FIFO 为空,说明没人排队,无法取数据。
读取 FIFO 里的数据(拿饭),读指针 read_index 往前走。
队伍人数 count--,说明数据减少了。
int main() {
FIFO_t fifo;
fifo_init(&fifo);
// 写入数据
fifo_write(&fifo, 10);
fifo_write(&fifo, 20);
fifo_write(&fifo, 30);
// 读取数据
uint8_t value;
while (fifo_read(&fifo, &value)) {
printf("取出的数据: %d\n", value);
}
return 0;
}
FIFO 就像一个排队取饭的过程,先进的先出!