Describe how you would configure and use Direct Memory Access (DMA) to handle high-bandwidth UART incoming data without overloading the CPU.
Implement a simulation using a circular DMA buffer. The function receives UART bytes in batches, drains the buffer at CPU polling points, returns delimiter-terminated frames, and counts bytes overwritten before processing.
Input uses data as a list of byte values, buffer_size as the circular buffer capacity, and service_after as batch sizes whose sum equals len(data). Return (frames, dropped_bytes), where each frame is a list of byte values excluding the delimiter.
def process_uart_dma(data, buffer_size, service_after):