본문 바로가기

development tech and log5

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 수신 인터럽트 - 링버퍼로 구현하기 2편 오늘은 링버퍼 예제소스를 작성해놓겠다. 우선 인터럽트 부분은 일반적으로 똑같다. typedef struct ring_buff { unsigned char buff[RX_MAX_SIZE]; int addr; int addr_now; int parser_point; int backup_point; unsigned char overflow; }ring_buff_t static ring_buff_t rx; void RX_init(void) { memset(&rx, 0 , sizeof(ring_buff_t)); } void RX_INT (void) { ring_buff_t *p_rx; p_rx = ℞ r_rx.buff[p_rx.addr++] = RXD; if(p_rx.addr>=RX_MAX_SIZE) { p.. 2020. 3. 30.
UART 수신 인터럽트 - 링버퍼로 구현하기 1편 수신데이터를 저장 및 불러오는 방법은 여러가지가 있다. 프로토콜의 길이와 헤더와 테일이 정해져있다면, 굳이 링버퍼를 사용할 필요가 없다. 단순히 헤더 수신 후 길이만큼 읽고, 체크썸이나 CRC 등으로 데이터 무결성?만 확인하면 된다. 하지만, 데이터의 길이가 달라지는 경우 또는 데이터의 수신타이밍 등등 규칙적이지 않은 데이터를 수신하게 될 때, 링버퍼를 사용하면 손실율을 줄일 수 있다. 나는 왠만하면 링버퍼를 사용한다. 1개의 데이터라도 손실되지 않게 하기 위해서이다. 또한 협업 시 상대모듈과 디버깅 할 때도 편리하다. 링버퍼로 통신 구현 방법은 그리 어렵지 않다. 1. 수신부분과 읽어오는 부분은 독립적으로 로직을 구현한다. 아래 그림에 붉은색으로 표시한 수신부는 데이터 수신 시 저장주소를 증가 시키며 .. 2020. 3. 29.
ADC는 어떻게 구현해야할까? - 1편 ADC 원리 공부 우선 ADC의 원리부터 공부하자 ADC는 아날로그를 디지털로 변화 시킨다는 Analog-to-digital converter 의 줄임말이다. 아날로그라고는 하지만, 입력신호는 디지털 신호이다. DC라고하는게 더 맞다고 생각한다. 단순하게 생각하는 AC 전압을 디지털화하는 회로는 조금 더 복잡하겠지? 이쪽으로 공부를 게을리해서... 그리고 오래되서 다 까먹었지만... 간단하게 생각하면, DC는 진폭의 변화만 있고, AC는 진폭과 위상의 변화가 있다고 생각하면 될 것 같다. (모든 실제 소스에는 진폭과 위상의 변화가 있지만, 사람이 보기에는 그리고 이상적으로 보면 위처럼 보인다고 볼 수 있다) 어쨌든.. ADC 모듈의 회로는 아래 그림처럼 이루어져있다. MCU 모듈에는 VA REF라는 핀이 있다. ADC 모.. 2020. 3. 29.
C언어 문자열 붙여넣기 오늘 하루종일 삽질을 한 것 같다. 문자열을 전송하는 것(거기다 C로...)은 거의 안해봤는데, 현재 수행하는 프로젝트의 프로토콜이 문자열로 되어있다...ㅜ 현재 회사에서는 RENESAS MCU를 사용하기 때문에, 어쩔수 없이 전용 툴인 CS+라는 컴파일 툴을 사용해야한다. 근데 해당 툴에서 C 기본 라이브러리에서 제공하는 문자열 함수가 제대로 동작안하는 것 같아서, 같은 방식의 함수를 만들었다. my_strcat(char *str1 , char *str2) { int str1_cnt; int str2_cnt; char *return_val; return_val = (char *) malloc( strlen(str1) + strlen(str2) ); for( str1_cnt = 0 ; str1_cnt <.. 2020. 3. 10.