C语言实现FIFO

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stdint.h"
#include "stdbool.h"

typedef struct {
  uint8_t* data;
  uint32_t isize;
  uint32_t isum;
  uint32_t wpos;
  uint32_t rpos;
  bool is_full;
} fifo_t;

int fifo_create(uint32_t isum,uint32_t isize)
{
    fifo_t *pfifo = (fifo_t *)malloc(sizeof(fifo_t));
    pfifo->isum = isum;
    pfifo->isize = isize;
    pfifo->wpos = 0;
    pfifo->rpos = 0;
    pfifo->is_full = false;
    pfifo->data = (uint8_t *)malloc(isum*isize);
    return (int)pfifo;
}


void fifo_delete(int fifo_index)
{
    fifo_t *pfifo = (fifo_t *)fifo_index;
    free(pfifo->data);
    pfifo->data = NULL;
    free(pfifo);
    pfifo = NULL;
}

bool fifo_writeable(int fifo_index)
{
    fifo_t *pfifo = (fifo_t *)fifo_index;
    return !pfifo->is_full;
}

bool fifo_write(int fifo_index, uint8_t *data)
{
    fifo_t *pfifo = (fifo_t *)fifo_index;
    if (pfifo->is_full)
    {
        return false;
    }

    memcpy(pfifo->data + pfifo->wpos * pfifo -> isize, data, pfifo->isize);
    pfifo->wpos++;

    if (pfifo->wpos >= pfifo->isum)
    {
        pfifo->wpos = 0;
    }
    if (pfifo->wpos == pfifo->rpos)
    {
        pfifo->is_full = true;
    }

    return true;
}

bool fifo_readable(int fifo_index)
{
    fifo_t *pfifo = (fifo_t *)fifo_index;
    if (pfifo->wpos == pfifo->rpos && !pfifo->is_full)
    {
        return false;
    }
    return true;
}

bool fifo_read(int fifo_index, uint8_t *data)
{
    fifo_t *pfifo = (fifo_t *)fifo_index;
    if (pfifo->wpos == pfifo->rpos && !pfifo->is_full)
    {
        return false;
    }

    memcpy(data, pfifo->data + pfifo->rpos * pfifo->isize, pfifo->isize);
    pfifo->rpos++;
    if (pfifo->rpos >= pfifo->isum)
    {
        pfifo->rpos = 0;
    }
    pfifo->is_full = false;
    return true;
}

int fifo_readable_item_count(int fifo_index)
{
    fifo_t *pfifo = (fifo_t *)fifo_index;
    if (pfifo->is_full)
    {
        return pfifo->isum;
    }
    else
    {
        return (pfifo->isum + pfifo->wpos - pfifo->rpos) % pfifo->isum;
    }
}



int fifo_writeable_item_count(int fifo_index)
{
    fifo_t *pfifo = (fifo_t *)fifo_index;
    if (pfifo->is_full)
    {
        return 0;
    }
    else
    {
        if (pfifo->wpos == pfifo->rpos)
        {
            return pfifo->isum;
        }
        else
        {
            return (pfifo->isum + pfifo->rpos - pfifo->wpos) % pfifo->isum;
        }
    }
}


int main()
{
    uint8_t *bd = 0;
    uint8_t k = 0;
    uint8_t *re = &k;
    int fifo1 = fifo_create(10, sizeof(uint8_t));

    for (uint8_t i = 0; i < 100; i++)
    {
       bd = &i;
        if (fifo_writeable(fifo1))
        {
            fifo_write(fifo1, bd);

            printf("可写:%d 可读:%d\n", fifo_writeable_item_count(fifo1), fifo_readable_item_count(fifo1));
        }
       else
       {
         printf("不可写");
         return 0;
       }
        if (fifo_readable(fifo1) == false)
        {
            break;
        }
        fifo_read(fifo1, re);
        printf("read:%u \n", *re);
    }

    return 0;
}

借鉴:(9条消息) C语言实现标准FIFO_jdh99的专栏-CSDN博客_c fifo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值