분명히 버그가 있는데, 찾을 수 없었다.
원인은 '='하나 빼먹어서 밀리는 증상 나옴,
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 |