「弱小和无知不是生存的障碍,傲慢才是」|

shumei52

园龄:1年7个月粉丝:8关注:1

嵌入式组件-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 中国大陆许可协议进行许可。

posted @   shumei52  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起