Использование последовательного DMA ввода сложно, когда входящие данные не являются непрерывным потоком или пакетами фиксированной длины. Точные данные будут зависеть от специфицированных c контроллеров UART и DMA, но, как правило, каждый поступающий символ будет скопирован в местоположение next в предоставленном буфере DMA, и прерывание будет сгенерировано Контроллер DMA, когда буфер наполовину заполнен и полностью заполнен.
Однобайтовый буфер DMA служит малой цели по сравнению с использованием доступного прерывания данных UART и просто задержит обработку байтов на один символьный период.
Если бы ваш буфер DMA был длиной два символа, вы бы получили прерывание для каждого символа (один для половины передачи и один для полной передачи), что решает проблему частично заполненные буферы не обслуживаются, но совсем не уменьшают издержки на прерывания, поэтому дают небольшое преимущество по сравнению с прямой обработкой прерываний UART. Если ваш UART включает буфер FIFO, это был бы лучший способ справиться с асинхронным последовательным вводом, когда требуется только небольшая буферизация.
Когда используется больший буфер DMA, частота прерываний уменьшается, но если буфер не заполнен, вы не получите прерывания, и данные могут ждать бесконечно долго. Одним из решений этой проблемы является реализация механизма тайм-аута, при котором, если прерывание DMA не поступает в течение периода времени, определяемого скоростью передачи и длиной буфера, то обработчик тайм-аута извлекает все данные, буферизованные в настоящее время. Такой механизм требует осторожности, чтобы избежать состязаний между тайм-аутом и прерыванием DMA, и обеспечить, чтобы данные, поступающие в то время, когда обрабатывается тайм-аут, не терялись или чтобы данные, полученные по таймауту, не повторялись, когда прерывание прямого доступа к памяти в конечном счете прибывает.