[STM32] UART_Tx 및 Rx (링버퍼 이용)

이채윤·2022년 4월 26일
1

임베디드

목록 보기
20/70

[링버퍼란?]

  • 링버퍼는 원형 큐 이다.
  • 큐(Queue)라는 것은 FIFO(First in First out)의 능력을 가졌다.
  • FIFO는 선입선출이라는 능력을 가졌으므로 첫번째에 들어간 Data가 가장 처음으로 출력된다.
  • 원형 큐(Ringbuffer)는 이 선형큐에서 n+1시킨 것이다.
  • n+1이 무엇이냐면, 선형 큐는 n개의 메모리를 가지고 있는데, 선형 큐의 메모리가 꽉 차게되면 Overflow가 된다. 즉 더이상 data를 쓸 수 없다. 그래서 나온게 n+1 = 0 이다.
  • n개의 메모리가 증가하다가 n+1이 되면 0으로 다시 돌아간다. 라는 의미이다.

[앞서 진행한 printf()방식과 같은 polling방식으로 진행하면 안되는 이유?]

  • 앞서 printf()를 사용할때 USART를 사용했다. 하지만 Tx출력 기능만을 이용했기에 Polling방식을 이용하더라도 큰 문제없이 USART 출력이 가능했다.
  • 하지만 통신으로 Rx 입력을 받게 된다면 Polling방식으로는 수신 데이터 유실 및 프로그램 구현에 불편함이 많다.

[진행 방향]

  • 위와 같은 이유 때문에 USART 수신 인터럽트를 이용하여 수신 데이터를 링버퍼에 저장하고 링 버에 있는 내용을 읽어오는 방향으로 진행할 것이다.

[Rx만 링버퍼를 사용하고 Tx는 사용하지 않는 이유]

  • 수신쪽은 다른 처리와 병행하면서도 수신 바이트를 한개라도 놓치는 일이 없어야 하는 부담 때문에 인터럽트와 링버퍼를 거의 필수적으로 사용하지만, 송신쪽은 송신 시간동안 다른 처리가 지연되더라도 별 문제가 안될시라면 굳이 인터럽트를 안쓰고도 무리가 없다.

0개의 댓글