#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;
}
C语言实现FIFO
最新推荐文章于 2024-01-17 10:31:02 发布