C언어,ARM

FIFO버그

안녕1999 2020. 7. 25. 22:05

분명히 버그가 있는데, 찾을 수 없었다.
원인은 '='하나 빼먹어서 밀리는 증상 나옴,
if(p->w>p->buf_len)//버그(ERR)
if(p->w>=p->buf_len)//버그수정

 

#ifndef FIFO_H
#define FIFO_H

#ifndef byte1
	#define byte1 unsigned char
#endif
#ifndef byte2
	#define byte2 unsigned short
#endif

typedef struct 
{
	byte1 *buf;
	int r,w,cnt,buf_len;
	int new_line_cnt,new_line_cnt_old;
}sFIFO;
void sFIFO_init(volatile sFIFO *p,byte1 *buf,int len);
void sFIFO_push(volatile sFIFO *f,byte1 a);
byte1 sFIFO_pop(volatile sFIFO *p);
int sFIFO_write(volatile sFIFO *p,void *pdata,int n);
int sFIFO_read(volatile sFIFO *p,void *pdata,int n);
#define sFIFO_Count(psFIFO)	((psFIFO)->cnt)
#define sFIFO_EmptyCount(psFIFO)	((psFIFO)->buf_len-(psFIFO)->cnt)
//c문자가 나오기전까지 읽는다.
//c문자는 읽고 버린다.
int sFIFO_read_while_not(volatile sFIFO *p,void *pdata,int n,char c);
void RTrim(char *s);

void DEBUG_FIFO_view(volatile sFIFO *p);
#endif
#include "..\src\fifo.h"
#include "cpu.h"
void DEBUG_FIFO_view(volatile sFIFO *p)
{
	char buf[128];
	sprintf(buf,"cnt=%d,w=%d,r=%d",p->cnt,p->w,p->r);
	DEBUG_puts(buf);
}
void sFIFO_init(volatile sFIFO *p,byte1 *buf,int len)
{
	p->buf=buf;
	p->buf_len=len;
	p->cnt=0;
	p->r=0;
	p->w=0;
	p->new_line_cnt=0;
	p->new_line_cnt_old=0;
}
void sFIFO_push(volatile sFIFO *p,byte1 a)
{
	if(p->cnt<p->buf_len)
	{
		p->buf[p->w]=a;
		p->w++;
		if(p->w>=p->buf_len)
		{
			p->w=0;
		}
		else
		{
		}
		if(a=='\n')
		{
			p->new_line_cnt++;
		}
		else
		{
		}
		p->cnt++;
	}
	else
	{
		//full
	}
}
int sFIFO_write(volatile sFIFO *p,void *pdata,int n)
{
	int cnt=p->cnt;
	byte1 *a=(byte1 *)pdata;
	while(n>0)
	{
		if(p->cnt<p->buf_len)
		{
			p->buf[p->w]=*a;
			p->w++;
			if(p->w>=p->buf_len)
			{
				p->w=0;
			}
			else
			{
				//ok
			}
			if(*a=='\n')
			{
				p->new_line_cnt++;
			}
			else
			{
			}
			p->cnt++;
		}
		else
		{
			//full
			break;
		}
		n--;
		a++;
	}
	return p->cnt-cnt;
}
byte1 sFIFO_pop(volatile sFIFO *p)
{
	byte1 a;
	if(p->cnt>0)
	{
		a=p->buf[p->r];
		p->r++;
		if(p->r>=p->buf_len)
		{
			p->r=0;
		}
		else
		{
			//ok
		}
		p->cnt--;
	}
	else
	{
		//empty
		a=0;
	}
	return a;
}
int sFIFO_read(volatile sFIFO *p,void *pdata,int n)
{
	int cnt=p->cnt;
	byte1 *a=(byte1 *)pdata;
	while(n>0)
	{
		if(p->cnt>0)
		{
			*a=p->buf[p->r];
			p->r++;
			if(p->r>=p->buf_len)
			{
				p->r=0;
			}
			else
			{
				//ok
			}
			p->cnt--;
		}
		else
		{
			//empty
			break;
		}
		n--;
		a++;
	}
	return cnt-p->cnt;
}
//c문자가 나오기전까지 읽는다.
//c문자는 읽고 버린다.
int sFIFO_read_while_not(volatile sFIFO *p,void *pdata,int n,char c)
{
	int cnt=p->cnt;
	byte1 *a=(byte1 *)pdata;
	while(n>0)
	{
		if(p->cnt>0)
		{
			*a=sFIFO_pop(p);
			if(*a==c)
			{
				break;//중단
			}
			else
			{
				//계속
			}
		}
		else
		{
			//empty
			break;
		}
		n--;
		a++;
	}
	*a=0;
	return cnt-p->cnt;
}
#include "string.h"
void RTrim(char *s)
{
	char *p;
	int len=strlen(s);
	//DEBUG_puts_str("RTrim_START",s);
	if(len>0)
	{
		p=s+len-1;
		while(len>0)
		{
			len--;
			switch(*p)
			{
			case ' ':
			case '\r':
			case '\n':
			case '\t':
				*p=0;
				break;
			default:
				len=0;//break;
				break;
			}
			p--;			
		}
	}
	else
	{
		//길이가 0
	}
	//DEBUG_puts_str("RTrim_END",s);
}