.h
#define BufW u8 //width
/**/
typedef struct FIFO_STRUCT{
u16 lenght; //fifo length
u16 snum;
u16 head;
u16 tail;
BufW *str;
}fifo;
.c
/**
* @brief ���ζ�д
*
*/
#include "uFifo.h"
/**
* @brief
*
* @param ififo
* @param str 队列的实际存储空间
* @param lenght 队列的长度
*/
u16 uFifoInit(fifo *ififo,BufW *str,u16 lenght){
if(lenght==0)return 0;
ififo->head = 0;
ififo->snum = 0;
ififo->tail = 0;
ififo->str = str;
ififo->lenght = lenght;
return 1;
}
/**
* @brief
* 写一个数据到队列
* @param ififo
* @param buf
*/
void uFifoWrite(fifo *ififo,BufW buf){
if(ififo->snum < ififo->lenght){
ififo->str[ififo->head] = buf;
if(++ififo->head >= ififo->lenght){
ififo->head = 0;
}
ififo->snum++;
}
}
/**
* @brief
* 获取队列内数据量
* @param ififo
* @return u8
*/
u16 uFifoAvailable(fifo *ififo){
return (ififo->snum);
}
/**
* @brief
* 读一个数据
* @param ififo
* @return BufW
*/
BufW uFifoRead(fifo *ififo){
BufW buf = ififo->str[ififo->tail];
if(++ififo->tail >= ififo->lenght){
ififo->tail = 0;
}
if(ififo->snum)ififo->snum--;
return buf;
}
//
实用示例
u8 expFifoStr[100];
fifo expFifo;
u8 expFifoStr2[200];
fifo expFifo2;
void exp(void){
uFifoInit(&expFifo, expFifoStr, 100);
uFifoInit(&expFifo2, expFifoStr2, 200); //
while(1){
uFifoWrite(&expFifo,'H');
uFifoWrite(&expFifo,'E');
uFifoWrite(&expFifo,'L');
uFifoWrite(&expFifo,'L');
uFifoWrite(&expFifo,'O');
uFifoWrite(&expFifo2,'W');
uFifoWrite(&expFifo2,'O');
uFifoWrite(&expFifo2,'R');
uFifoWrite(&expFifo2,'L');
uFifoWrite(&expFifo2,'D');
while(uFifoAvailable(&expFifo)){
printf("%c",uFifoRead(&expFifo));
}
while(uFifoAvailable(&expFifo2)){
printf("%c",uFifoRead(&expFifo2));
}
}
}