DMA & Buffer Ownership
Table of contents
핵심 요약
DMA는 CPU의 mutex나 IRQ mask를 따르지 않고 메모리를 읽고 쓸 수 있다. DMA가 접근하는 buffer의 소유권과 실제 전송 완료를 기준으로 재사용 시점을 결정한다.
RX Buffer Ownership
stateDiagram-v2
[*] --> FREE
FREE --> DMA_WRITING: RX 준비 / DMA 시작
DMA_WRITING --> READY: 실제 완료 확인
READY --> CPU_READING: CPU에 소유권 전달
CPU_READING --> FREE: 처리 완료
DMA_WRITING --> ABORTING: timeout / cancel
ABORTING --> FREE: DMA 정지와 늦은 callback 처리 확인
note right of DMA_WRITING
CPU는 해당 Buffer를 수정하거나 재사용하지 않음
end note
note right of READY
필요 시 Cache Maintenance 후 읽기
end note
timeout이 발생해도 DMA가 즉시 정지했다고 가정하면 안 된다. abort 완료와 늦은 callback 처리까지 확인한 뒤 Buffer를 반환한다. 그림의 상태 전환 자체에도 실행 문맥에 맞는 동기화가 필요하다.
버퍼 상태 머신
RX: FREE → DMA_WRITING → READY → CPU_READING → FREE
TX: FREE → CPU_WRITING → DMA_READING → FREE
상태 변경마다 owner·허용 접근·완료 조건을 명확히 한다.
DMA 완료가 주변장치의 wire-level 송신 완료인지 별도로 확인한다.
TX와 RX cache 처리
캐시가 있는 non-coherent DMA 환경에서는 TX 시작 전에 해당 buffer의 수정 데이터를 메모리로 clean하고 필요한 순서를 보장한다. RX는 CPU dirty line이 DMA 결과를 나중에 덮어쓰지 않도록 시작 전 상태를 처리하고 완료 후 읽기 전에 필요한 invalidate를 수행한다. 정확한 API·순서는 MCU SDK의 DMA/cache 가이드에 따른다. cache가 없거나 coherent인 영역에는 같은 처리가 필요하지 않을 수 있다.
- cache line에 다른 변수가 함께 있으면 invalidate로 그 변수의 dirty 데이터까지 잃을 수 있다. DMA buffer alignment와 크기·메모리 영역을 맞춘다.
- descriptor와 payload 모두 DMA 접근 가능한 메모리에 있어야 한다. stack 수명·정렬·전송 폭·최대 길이를 검증한다.
- double buffering에서도 DMA가 다음 buffer로 넘어가기 전에 consumer가 처리했는지 확인한다. 처리 지연 시 overwrite/drop/backpressure 정책을 정의한다.
timeout과 cancel
API timeout은 DMA 정지를 보장하지 않는다. abort 요청 후 하드웨어가 멈췄는지와 늦은 callback 가능성을 확인해야 buffer를 해제할 수 있다. 요청 generation/sequence를 두어 이전 전송의 완료 알림이 다음 요청을 완료시키지 않도록 한다.
주변장치별 적용
| 항목 | 설명 및 적용 기준 |
|---|---|
| UART | RX idle event는 메시지 경계와 항상 같지 않다. 수신 buffer의 유효 길이를 parser에 전달하고 framing은 별도로 처리한다. |
| SPI | DMA TX 완료 뒤 FIFO/shift register가 남아 있을 수 있다. CS 해제는 실제 완료 조건을 따른다. |
| ADC | half/full buffer 완료 시 소유권을 교환하고 채널 순서·sample counter·overrun을 확인한다. |
| CAN | controller RAM과 소프트웨어 buffer의 소유권을 구분하고 다음 RX arm이 이전 데이터를 덮어쓰지 않도록 한다. |
검증
지연 consumer, 강제 timeout·abort, 잘못된 길이, 반복 재시작, IRQ masking, DMA error를 재현한다. buffer 경계 guard·sequence·누락 카운터로 손상을 찾되 검증용 guard가 하드웨어 bounds 보호를 대신하지는 않는다.