用C语言实现FIFO (简单版
程序员文章站
2024-03-18 14:37:16
...
#include <stdio.h>
#include <windows.h>
#define fifo_max 110 //分配给fifo的空间,设置为2的n次幂可以快速求余
int fifo_top; //队顶指针
int fifo_bot; //队底指针
int fifo_size;//队长度
char fifo_buff[1000];//缓冲区
/**
* @brief 初始化FIFO
* @retval 无
*/
void fifo_init(){
fifo_top=0;
fifo_bot=0;
fifo_size=0;
}
/**
* @brief 将数据压入FIFO
* @param Addr I 待入FIFO的数据
* @param len I 待入FIFO的数据量
* @retval 1 成功入fifo 0 fifo空间不足
*/
char fifo_in(char * Addr,int len){
int i;
//判断FIFO是否还有空间
if(len>(fifo_max-fifo_size))return 0;
for(i=0;i<len;i++){
fifo_buff[fifo_top]=Addr[i];
//计算下一个地址
fifo_top=(fifo_top+1)%fifo_max;
}
fifo_size+=len;
return 1;
}
/**
******************************************************************************
** \brief 获取数据,并弹出FIFO
** @param buf O 数据输出地址(每次必须是384byte)
** @param size I 要出FIFO的个数,每次384个
** @retval 1成功 0失败
******************************************************************************/
char fifo_out(char* buf, int size){
int i;
if(fifo_size<size)return 0;//FIFO剩余数据量不足
for(i=0;i<size;i++){
buf[i]=fifo_buff[fifo_bot];
fifo_bot=(fifo_bot+1)%fifo_max;
}
fifo_size-=size;
return 1;
}
int main()
{
int i;
char indata[]={"hello fifo"};
char outdata[20]={0};
printf("test data size is %d\r\n",sizeof(indata));
fifo_init();
//入队测试
fifo_in(indata,sizeof(indata));
//出队测试
fifo_out(outdata,sizeof(indata));
printf("%s\r\n",outdata);
//爆入队测试
for(i=0;i<20;i++){
if(fifo_in(indata,sizeof(indata))){
printf("in\r\n");
}else{
printf("fail %d\r\n",i);
}
}
//爆出队测试
for(i=0;i<20;i++){
if(fifo_out(outdata,sizeof(indata))){
printf("%s\r\n",outdata);
}else{
printf("fail %d\r\n",i);
}
}
Sleep(10000);
//随机测试
while(1){
for(i=0;i<rand()%20;i++){
fifo_in(indata,sizeof(indata));
}
for(i=0;i<rand()%20;i++){
if(fifo_out(outdata,sizeof(indata))){
printf("%s,",outdata);
}else{
printf("-%d-",i);
}
}
printf("\r\n");
Sleep(1000);
}
return 0;
}
上一篇: Qt下实现16进制收发数据