본문 바로가기

링버퍼2

UART 수신 인터럽트 - 링버퍼로 구현하기 3편 이번글은 링버퍼를 사용하기 위해 필요한 간단한 파싱로직함수를 기록해둔다. 링버퍼 로직을 사용할 때 가장 중요한 것은 데이터의 위치를 잘 파악하는 것이다. 그 중 정해진 크기에서 오버플로우 되는 부분이 중요하다. 아래는 해당 부분에서의 파싱을 위한 조건을 넣은 함수이다. - 현재 이전포인트에서 현재포인트까지의 길이를 구하는 함수 unsigned char GET_parsing_length(void) { wifi_recv_t *p_comm; p_comm = &recv; if(p_comm->recv_addr_now>p_comm->recv_addr_parser_point) { return ( p_comm->recv_addr_now - p_comm->recv_addr_parser_point ); } else if(.. 2020. 4. 19.
UART 수신 인터럽트 - 링버퍼로 구현하기 1편 수신데이터를 저장 및 불러오는 방법은 여러가지가 있다. 프로토콜의 길이와 헤더와 테일이 정해져있다면, 굳이 링버퍼를 사용할 필요가 없다. 단순히 헤더 수신 후 길이만큼 읽고, 체크썸이나 CRC 등으로 데이터 무결성?만 확인하면 된다. 하지만, 데이터의 길이가 달라지는 경우 또는 데이터의 수신타이밍 등등 규칙적이지 않은 데이터를 수신하게 될 때, 링버퍼를 사용하면 손실율을 줄일 수 있다. 나는 왠만하면 링버퍼를 사용한다. 1개의 데이터라도 손실되지 않게 하기 위해서이다. 또한 협업 시 상대모듈과 디버깅 할 때도 편리하다. 링버퍼로 통신 구현 방법은 그리 어렵지 않다. 1. 수신부분과 읽어오는 부분은 독립적으로 로직을 구현한다. 아래 그림에 붉은색으로 표시한 수신부는 데이터 수신 시 저장주소를 증가 시키며 .. 2020. 3. 29.