### 0.0.1 고속 UART 통신 시 DMA(Direct Memory Access) 활용을 통한 CPU 점유율 최적화

### 0.0.1 고속 UART 통신 시 DMA(Direct Memory Access) 활용을 통한 CPU 점유율 최적화

초당 수백 프레임의 고해상도 고도 데이터를 쏟아내는 직렬 인터페이스(Serial) 기반 라이다를 사용할 경우, 피치 못하게 통신 보드레이트(Baudrate)를 115200 \ bps 에서 921600 \ bps 이상으로 끌어올려야 한다. 이때 단순히 NuttX의 기본 인터럽트 구동(Interrupt-Driven) 시리얼 드라이버 설계에만 의존하면, 수신되는 바이트(8 \ bits) 하나당 매번 CPU가 하던 비행 연산을 멈추고 컨텍스트 스위칭(Context Switching)을 해야 하는 끔찍한 오버헤드가 발생한다.

DMA(Direct Memory Access) 기반 수신 파이프라인의 원리

PX4 아키텍처의 중추인 STM32 칩셋군은 이 문제를 원천 차단하기 위해 하드웨어 DMA(Direct Memory Access) 컨트롤러를 제공한다.
드론 개발자가 펌웨어 컴파일 시 보드 설정 파일(예: board_config.h)에서 특정 UART 포트(예: 직렬 라이다가 연결된 TELEM2 포트)에 대해 HWDEF의 RX DMA 채널을 할당하게 되면, 시리얼 포트로 들어오는 데이터는 다음과 같이 전개된다.

  1. CPU 개입 배제: UART RX 핀을 통해 바이트가 들어오면 CPU(Cortex-M 코어)는 전혀 모르는 사이에, 별도의 하드웨어 칩인 DMA 컨트롤러가 직접 이 바이트를 채워 지정된 RAM 버퍼(Ring Buffer) 구역으로 퍼 나른다.
  2. 버퍼 묶음 전송(Half/Full Transfer Interrupt): DMA 버퍼가 절반(Half) 차거나 꽉 찼을(Full) 때, 혹은 통신 회선이 잠시 쉬는 공백기(Idle Line Detection)가 발생했을 때 비로소 DMA 컨트롤러가 CPU에게 단 한 번의 인터럽트를 날린다.
  3. 드라이버 Wake-up: 이때 잠들어 있던 tfminilightware 드라이버 Task가 깨어나, RAM에 이미 온전히 정렬되어 있는 수십~수백 바이트의 배열 블록을 한 번에 읽어가며 앞 절에서 설명한 FSM 파싱을 수행한다.

이러한 DMA 설계는 EKF2나 제어 루프가 돌아가야 할 CPU 사이클을 압도적으로 보호해 주며, 극심한 진동 상황에서 UART RX FIFO 오버런(Overrun)으로 인한 데이터 유실 현상을 완벽에 가깝게 방어하는 필수 요소다. 고해상도 고주파수(High Frequency) 로컬 센서를 기획하는 설계자라면 반드시 자신이 연결할 하드웨어 포트가 DMA 매핑이 지원되는 채널인지 MCU 레퍼런스 매뉴얼을 확인해야 한다.