嵌入式组件-fifo
此篇文章在2023年4月26日被记录
fifo适用于多种场景,例如在串口中断中来不及接受数据,可以将数据先缓存起来,在任务中再进行处理
fifo也可以称为环形队列,填入数据时在头部填入,取数据从尾部取出
FIFO.c
#include "fifo.h"
#include "stdio.h"
void fifo_init(fifo_t *obj, uint8_t *data_buffer, uint32_t buffer_size)
{
obj->data = data_buffer;
obj->size = buffer_size;
obj->head = 0;
obj->tail = 0;
obj->remain = 0;
memset(obj->data, 0, buffer_size);
}
uint8_t fifo_empty(fifo_t *obj)
{
return (obj->remain == 0);
}
uint8_t fifo_full(fifo_t *obj)
{
return (obj->remain == obj->size);
}
void fifo_put(fifo_t *obj, uint8_t data)
{
if (obj->head >= obj->size)
{
obj->head = 0;
}
if (obj->remain < obj->size)
{
++obj->remain;
obj->data[obj->head] = data;
obj->head++;
}
}
uint32_t fifo_puts(fifo_t *obj, uint8_t *data, uint32_t lenth)
{
uint32_t put_lenth = 0;
for (int i = 0; i < lenth; i++)
{
if (obj->remain >= obj->size)
{
break;
}
if (obj->head >= obj->size)
{
obj->head = 0;
}
obj->data[obj->head++] = data[i];
++obj->remain;
++put_lenth;
}
return put_lenth;
}
uint8_t fifo_get(fifo_t *obj)
{
uint8_t data;
if (obj->tail >= obj->size)
{
obj->tail = 0;
}
if (obj->remain > 0)
{
--obj->remain;
data = obj->data[obj->tail++];
}
return data;
}
uint32_t fifo_gets(fifo_t *obj, uint8_t *data, uint32_t lenth)
{
uint32_t get_cnt = 0;
for (int i = 0; i < lenth; ++i)
{
if (obj->remain == 0)
{
break;
}
if (obj->tail >= obj->size)
{
obj->tail = 0;
}
data[i] = obj->data[obj->tail++];
--obj->remain;
++get_cnt;
}
return get_cnt;
}
void fifo_log(fifo_t *obj)
{
printf("\n");
for (int i = 0; i < obj->size; i++)
{
printf(" %d ", obj->data[i]);
}
printf("\n");
}
FIFO.h
#ifndef _FIFO_H
#define _FIFO_H
#include <stdint.h>
#include <string.h>
typedef struct fifo
{
uint8_t *data;
uint8_t size;
uint8_t head;
uint8_t tail;
uint8_t remain;
uint8_t index;
} fifo_t;
void fifo_init(fifo_t *obj, uint8_t *data_buffer, uint32_t buffer_size);
uint8_t fifo_empty(fifo_t *obj);
uint8_t fifo_full(fifo_t *obj);
void fifo_put(fifo_t *obj, uint8_t data);
uint32_t fifo_puts(fifo_t *obj, uint8_t *data, uint32_t lenth);
uint8_t fifo_get(fifo_t *obj);
uint32_t fifo_gets(fifo_t *obj, uint8_t *data, uint32_t lenth);
void fifo_log(fifo_t *obj);
#endif
main.c (for test)
#include "fifo.h"
#include "stdio.h"
#define FIFO_LEN 16
static uint8_t fifo_buffer[FIFO_LEN];
fifo_t test_fifo;
int main(void)
{
uint8_t data = 0;
uint8_t read_buffer[20];
fifo_init(&test_fifo, &fifo_buffer[0], FIFO_LEN);
fifo_puts(&test_fifo, "hello world", strlen("hello world"));
fifo_log(&test_fifo);
fifo_gets(&test_fifo, read_buffer, strlen("hello world"));
for (int i = 0; i < strlen("hello world"); i++)
{
data = fifo_get(&test_fifo);
printf("get :%c\n", read_buffer[i]);
}
fifo_log(&test_fifo);
}
本文作者:shumei52
本文链接:https://www.cnblogs.com/shumei52/p/18604788
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)