블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2024.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

공지사항

최근에 올라온 글

FIFO버그

C언어,ARM / 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);
}

'C언어,ARM' 카테고리의 다른 글

와치독 타이머, CPU_sleep, Flash write  (0) 2020.07.31
vc++ 6.0 shiftF5Fix.dll 등록안되는 문제  (0) 2020.07.26
cannot open file "nafxcw.lib"  (0) 2020.07.18
MFC 파일 드래그 드롭  (0) 2020.07.18
ST-LINK 펌웨어 쓰기 설정  (0) 2020.07.11
Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함