ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
4 июня
1521619 Топик полностью
il-2 (31.05.2025 07:32, просмотров: 135) ответил Kpoк на Размышления ренегата. Каждый раз пытаясь слинять с моего любимого Мелкочипа (продажной девки империализма) на убогий СТМ (который не гасит свой сайт для русских юзеров), останавливаюсь на отсутствии буферов у УАРТА, СПИ, и проч. Оне рекомендуют юзать ДМА. Что скажут многолетние пользователи этого убожества: нагружать ДМА несколькими потребителями насколько кошерно? Нет ли эффекта очереди в туалет коммунальной квартиры? Там же ещё телевизор, интернет, цап, ацп - и все хотят к
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 может выскочить плюсом при кратковременной пиковой нагрузке (не будет пауз). Но на среднюю ЭФФЕКТИВНОСТЬ обравотки потока данных не повлияет - и в конце концов большие объемы данных будут упираться именно в эту среднюю эффективность.

Если выражаться твоими словами - туалет в коммунальной квартире с большой пропускной способностью (не дадут почитать газетку на толчке) по своей эффективности выше, чем персональные туалеты в квартире :-)