Цитата(SasaVitebsk @ Aug 27 2015, 12:14)

Прошу прощения, а можно мне пояснить ...
Зачем использовать DMA с FIFO. Скажем, что это даёт?
Буферизация ввода/вывода в любом случае полезна, даже без DMA.
Вот написали Вы в своей программе printf("Hello world!\n"); что приведёт к передаче в stdout тринадцати байт, а то и 14, если \n заменяется при выводе на пару \n\r.
Ну что теперь, ждать пока все эти байты будут переданы уартом и только после этого возвращать управление из printf ?
Конечно же нет, гораздо лучше передаваемые данные закинуть в некий промежуточный буфер, инициировать начало передачи и вернуться в основную программу, следующий оператор исполнять. А уж драйвер, обслуживающий уарт пусть сам разбирается с передачей, нам по большому счёту неважно как он будет это делать, по прерываниям или с использованием DMA.
Аналогично и на приёме. Байты по последовательной линии приходят не так уж и часто, по сравнению с быстродействием процессора, поэтому постоянно крутиться в цикле ожидания - а не принял ли наш уарт очедной байт? - неэффективно, надо же и другую, не менее важную работу делать. Поэтому драйвер уарта самостоятельно (по прерываниям, например) принимает приходящие данные и складирует их до времени в буфер (тот самый фифо). А когда основная программа соизволит поинтересоваться "ну что там?" отдаст ей принятое в лучшем виде.
Собственно, в обоих случаях фифо исполняет по сути одну и ту же функцию - выравнивает неравномерность скоростей поступления и переработки информации, и чем больше эта неравномерность тем больше должен быть размер буфера для избежания необходимости приостанавливать работу то источника, то потребителя.
В примере с printf буферизация на самом деле выполняется дважды. Ведь stdout это указатель на структуру FILE, в этой структуре лежат указатели на несколько буферов, т.е. эта структура вместе с низкоуровневыми функциями является фифо-буфером. В случае с уартом в принципе можно обойтись однократной буферизацией, либо работая напрямую с буферами из FILE либо заменив его своей реализацией фифо (и потерять с возможность использовать printf и putchar). Для более сложных устройств двойная буферизация - в программе и в драйвере - обычное дело.
Russia est omnis divisa in partes octo.