FIFO - это костыль архитектуры без DMA. У STM кстати, есть FIFO и у
UART и у SPI - на 1 байт :-) При наличии DMA этого достаточно,
чтобы обеспечить передачу без разрывов. DMA по определению переплевывает FIFO по всем параметрам. DMA берет/ложит данные сразу в память за несколько циклов, а чтобы опорожнять/наполнять FIFO нужны ltcznrb программны[ циклjd процессора (+ накладные на прерывание).
У меня есть проект, где используются почти все каналы DMA - АЦП с частотой выборок 30мкс, SPI на 18МГц, 3 UART на 750000бод.
АЦП работает постоянно, остальное - по мере надобности. Но даже когда я специально задействовал всю периферию на полную - сбоев не было, были только изредка паузы по SPI и UART.
Если бы это было не DMA, а FIFO - думаю паузы бы были гораздо длиннее, да и сбоев было дофига.
Кстати, чтобы при пиковых нагрузках не было сбоев (а были паузы) надо пользоваться простыми правилами для задания приоритетов каналам DMA (и для FIFO эти правила тоже действуют):
1. Делать связанные запросы (например SPI TX/RX или UART TX/RX) для синхронных каналов (TX) с более низким приоритетом по отношению к асинхронным (RX). Это позволит при пиковых нагрузках делать паузы в обмене. Если сделать наоборот - то будут сбои (пропуски приема)
2. Каналы DMA для равномерной выдачи/приема данных (АЦП) - задавать приоритеты более высокие для бОльшей частоты выборки.
На самом деле - все это в полной мере относится и к FIFO, и вообще эфективнось FIFO и DMA пожно сравнить по такой формуле:
Kfifo = (Размер FIFO + 1) / Кол.тактов для выборки (с учетом накладных на вызов прерывания)
Kdma = (Размер FIFO + 1) / Кол.тактов для выборки DMA = 2 / Кол.тактов для выборки DMA
Можно принять эмпирически, что кол тактов для FIFO где-то в 10 раз больше чем для DMA
Тогда получается, чтобы "дотянуться" до показателей DMA - нужен размер FIFO = 20-1 = 19байт !!!!!
И на самом деле, то что "FIFO у каждой периферии свой, а DMA - один" в этой формуле роли не играет. Множественность FIFO может выскочить плюсом при кратковременной пиковой нагрузке (не будет пауз). Но на среднюю ЭФФЕКТИВНОСТЬ обравотки потока данных не повлияет - и в конце концов большие объемы данных будут упираться именно в эту среднюю эффективность.
Если выражаться твоими словами - туалет в коммунальной квартире с большой пропускной способностью (не дадут почитать газетку на толчке) по своей эффективности выше, чем персональные туалеты в квартире :-)