Какой смысл DMA во встроенных процессорах?

17

Недавно я делал проект с mbed (LPC1768), используя ЦАП для вывода различных волн. Я прочитал части таблицы, и там говорилось о том, что у него есть DMA для многих периферийных устройств. Казалось, что это было бы полезно, но при дальнейшем чтении я обнаружил, что DMA использует ту же шину данных, что и процессор (что, я думаю, нормально). Означает ли это, что процессор не может взаимодействовать с какой-либо памятью, пока ЦАП получает данные? Кроме того, поскольку у ЦАПа не было буфера (насколько я могу судить) и, следовательно, он очень часто используется в DMA, какой смысл в DMA? Если процессор не может выполнять транзакции памяти, может ли он что-нибудь сделать?

BeB00
источник
8
Я предлагаю вам взглянуть на функции вашего процессора и, если он может делать что-то еще, кроме доступа к памяти. Я слышал о некоторых процессорах, которые могут делать такие вещи, как принятие решений или расчеты, не уверен, что это вообще распространено ..
PlasmaHH
Должен ли процессор тратить свое время на передачу данных на порт ввода-вывода или делегировать задачу выделенному устройству?
StainlessSteelRat
Да, процессор может выполнять другие функции, но во встроенной системе он, вероятно, тратит много времени на взаимодействие с периферийными устройствами, особенно с портами ввода / вывода. Не имеет ли больше смысла иметь дополнительную шину данных только для DMA? Или это обычно не нужно? Ситуация, когда вам понадобится дополнительная шина, - это когда вы пытаетесь расширить границы своего оборудования, что, я полагаю, когда вы все равно захотите использовать DMA?
BeB00
1
Простой пример, скажем, вы хотите много печатать информацию на последовательный порт. Вы можете либо сидеть и ждать отправки каждого байта (медленно), скопировать его в буфер и затем использовать прерывания на ЦП для отправки каждого байта, когда порт готов (много переключений контекста = медленно), или скопировать его в буфер и позволить контроллеру DMA измерять время, в течение которого процессор занят другими делами (может быть быстрее).
Том Карпентер
2
Однажды увидел обложку EDN, на которой был изображен мужчина в огромной обуви длиной три фута и заголовок: «Если это обувь, наденьте ее». Дело в том, что если деталь выполняет десять вещей, в которых вы не нуждаетесь, и одна вещь, которая вам нужна, и цена, занимаемая площадь и энергопотребление - все в порядке, то вы должны просто использовать его, а не тратить свое время на поиск чего-либо с меньшим количеством функций.
Соломон Слоу

Ответы:

17

LPC1768 техническое описание я нашел имеет следующие кавычки (курсив мой):

Восьмиканальный контроллер DMA общего назначения (GPDMA) на многослойной матрице AHB, который может использоваться с периферийными устройствами SSP, I2S-шины, UART, аналого-цифрового и цифро-аналогового преобразователя, сигналами совпадения таймера и для памяти в -памяти переводы.

Разделенная шина APB обеспечивает высокую пропускную способность с небольшим количеством остановок между процессором и DMA

Блок-схема на странице 6 показывает SRAM с несколькими каналами между матрицей AHB, и следующая цитата подтверждает это:

LPC17xx содержит 64 КБ встроенной статической оперативной памяти. Это включает в себя основной SRAM 32 кБ, доступный процессору и контроллеру DMA на высокоскоростной шине, и два дополнительных блока SRAM по 16 кБ каждый, расположенных на отдельном подчиненном порте многослойной матрицы AHB. Эта архитектура позволяет распределять доступ к ЦП и DMA по трем отдельным ОЗУ, к которым можно получить доступ одновременно

И это подтверждается следующей цитатой:

GPDMA обеспечивает транзакции между периферией в память, памятью в периферию, периферией в периферию и памятью в память.

Поэтому вы можете передавать данные на ваш ЦАП из одного из отдельных блоков SRAM или с другого периферийного устройства, используя основной SRAM для других функций.

Этот тип периферийных DMA-устройств распространен в небольших частях, где интерфейс памяти довольно прост (по сравнению, скажем, с современным процессором Intel).

Дэвид
источник
Ах, спасибо, я не осознавал, что это возможно, я немного новичок в DMA. Означает ли это, что процессор может получать доступ к периферийным устройствам, в то время как ЦАП обращается к отдельной SRAM?
BeB00
1
Да, это именно то, для чего предназначена матрица AHB. Это позволяет различным контроллерам (ЦП, DMA, определенным периферийным устройствам, таким как Ethernet и USB) получать доступ к разным вещам одновременно. Вот почему есть несколько «портов» для SRAM.
Дэвид
Да, AHB в этих дешевых маленьких игрушках обеспечивает безумную пропускную способность памяти благодаря параллельным банкам памяти: у вас может быть ethernet, USB2 и все, что работает с максимальной пропускной способностью, а процессор даже не замечает ...
peufeu
Кроме того, код большого пальца может поместить 2 инструкции в одно 32-разрядное слово, поэтому процессору может не потребоваться доступ к шине, которая часто используется при выполнении математических операций или операций, которые в основном связаны с регистрами ... С другой стороны, я думаю, что M3 и M4 могут делать несколько обращений к памяти за такт (инструкция и данные) из-за наличия нескольких шин.
peufeu
30

Коротко говоря, DMA позволяет центральному процессору эффективно вести себя на своей собственной скорости, тогда как периферийные устройства могут эффективно вести себя на своей собственной скорости. Большинство чисел в примере составлены.

Давайте сравним два варианта периодического сбора данных с АЦП:

  1. Вы можете установить АЦП как часть прерывания (периодическое или иное)
  2. Вы можете создать буфер и сообщить DMA о передаче показаний АЦП в буфер.

Давайте перенесем 1000 образцов из АЦП в ОЗУ.

Использование варианта 1: для каждого образца

  • 12 циклов потрачено на ввод прерывания
  • читать АЦП
  • магазин в баран
  • 12 циклов потрачено на выход из прерывания

Давайте представим, что эта функция прерывания состоит из 76 инструкций, вся подпрограмма имеет длину 100 инструкций, предполагая выполнение одного цикла (в лучшем случае). Это означает, что вариант 1 будет тратить 100 000 циклов процессорного времени на выполнение.

Вариант 2: DMA настроен на сбор 1000 образцов АЦП. Давайте предположим, что АЦП имеет аппаратный триггер от счетчика таймера.

  • АЦП и DMA передают 1000 образцов данных в оперативную память
  • DMA прерывает ваш процессор после 1000 образцов
  • 12 циклов потрачено на ввод прерывания
  • Код происходит (скажем, он говорит DMA перезаписать ОЗУ)
  • 12 циклов потрачено на выход из прерывания

Представление всего прерывания (с издержками входа и выхода) - это 100 однократных инструкций. Используя DMA, вы тратите только 100 циклов, чтобы сохранить те же 1000 образцов.

Теперь, каждый раз, когда DMA обращается к шине, да, может возникнуть спор между CPU и DMA. Процессор может даже быть вынужден ждать завершения работы DMA. Но ожидание завершения работы прямого доступа к памяти намного короче, чем привязка процессора к обслуживанию АЦП. Если тактовая частота ядра процессора равна 2x тактовой частоте шины, то процессор может тратить несколько ядерных циклов в ожидании завершения DMA. Это означает, что ваше эффективное время выполнения передачи составляет от 1000 (при условии, что процессор никогда не ждет) до 9000 циклов. Все еще ПУТЬ лучше, чем 100 000 циклов.

pgvoorhees
источник
2
Важно отметить, что ОЗУ - не единственное место, где процессор может хранить данные. Обычно ЦП загружает данные из ОЗУ в регистры, прежде чем работать с ним.
Арон
Да, абсолютно правильно. Мой пример - просто грубый набросок.
pgvoorhees
Многие микроконтроллеры также имеют многослойную шину, поэтому возможны параллельные операции. Например: adc-> ram и flash-> зарегистрироваться одновременно. Кроме того, многие инструкции длиннее 1 часа, поэтому для DMA достаточно времени.
Jeroen3
9

Если в данном цикле процессору и контроллеру DMA потребуется доступ к одной и той же шине, то одному или другому придется подождать. Многие системы, однако, содержат несколько областей памяти с отдельными шинами вместе с «мостом» шины, который позволит ЦПУ обращаться к одной памяти, а контроллер DMA - к другой.

Кроме того, многим ЦП может не потребоваться доступ к устройству памяти в каждом цикле. Если ЦПУ обычно требуется доступ к памяти только в двух из трех циклов, устройство DMA с низким приоритетом может использовать циклы, когда шина памяти в противном случае была бы неактивной.

Тем не менее, даже в тех случаях, когда каждый цикл DMA приводит к остановке ЦП для цикла, DMA может быть очень полезным, если данные поступают с достаточно медленной скоростью, чтобы ЦП мог выполнять другие операции между входящими элементами данных. , но достаточно быстро, что накладные расходы должны быть минимизированы. Например, если порт SPI передает данные на устройство со скоростью один байт каждые 16 циклов ЦП, например, прерывание ЦП для каждой передачи может привести к тому, что он почти все свое время будет входить и выходить из подпрограммы обработки прерываний, и ни один делать любую фактическую работу. Однако при использовании DMA издержки могут быть уменьшены до 13%, даже если каждая передача DMA приводит к остановке ЦП в течение двух циклов.

Наконец, некоторые процессоры позволяют выполнять DMA, пока процессор спит. Использование передачи на основе прерываний потребует полного пробуждения системы для каждой передаваемой единицы данных. Однако, используя DMA, контроллер сна может подавать на контроллер памяти пару часов каждый раз, когда поступает байт, но позволяет всему остальному оставаться в спящем режиме, что снижает энергопотребление.

Supercat
источник
1
Части Cortex-M, такие как LPC1768, имеют отдельный путь памяти от флэш-памяти до декодера команд, так что на самом деле операции «регистр-регистр» могут означать, что ЦПУ может выполнять несколько инструкций между временами, когда ему необходим доступ к памяти данных.
Крис Страттон
5

Как программист, DMA является опцией для передачи данных в и из периферийных устройств, которые его поддерживают. Для классического примера смещения большого буфера через последовательное периферийное устройство, такого как SPI или UART, или сбора нескольких выборок из АЦП, у вас есть три способа перемещения этих данных:

  1. Метод опроса. Здесь вы ждете флагов регистра, чтобы позволить вам сдвинуть / вывести следующий байт. Проблема в том, что вы задерживаете все выполнение процессора, ожидая этого. Или, если вам придется делить процессорное время в операционной системе, то ваша передача будет значительно замедлена.

  2. Метод прерывания. Здесь вы пишете подпрограмму обработки прерываний (ISR), которая выполняется с каждой передачей байтов, и вы пишете код в ISR, который управляет передачей. Это более эффективно для ЦП, поскольку ЦП будет обслуживать ваш ISR только при необходимости. Это бесплатно для использования в любое другое время, кроме как в ISR. ISR также является одним из более быстрых вариантов осуществления перевода с точки зрения скорости передачи.

  3. DMA. Вы настраиваете DMA с указателями источника / назначения, количеством передач и выключается. Он выполнит кражу циклов шины и процессорного времени для выполнения передачи, а центральный процессор может делать другие вещи в это время. Вы можете настроить флаг или прерывание, чтобы указать, когда передача завершена. Обычно это на ощупь быстрее, чем ISR, и, как правило, это ваш самый быстрый способ передачи.

Как программист, я предпочитаю DMA, потому что это самый простой код и, по сути, самый быстрый метод для передачи. Как правило, вам просто нужно настроить пару регистров для указателей источника / назначения и количества передач, чтобы сделать и выключить его. Я трачу гораздо больше времени на работу с кодом ISR, чем с кодом с ускорением DMA, потому что код ISR требует критических навыков проектирования и должен быть закодирован, протестирован, проверен и т. Д. Код DMA намного меньше, и код, который я должен написать сам относительно тривиально, и я получаю максимальную скорость передачи в сделке.

По моему опыту, в последнее время с процессорами Atmel SAM3 / 4 DMA работает на ощупь быстрее, чем эффективный ISR моего собственного крафта. У меня было приложение, которое будет читать пачку байтов из SPI каждые 5 мсек. В фоновых задачах возникало много математических операций с плавающей запятой, поэтому я хотел, чтобы центральный процессор был максимально свободным для этих задач. Первоначальной реализацией был ISR, а затем я перешел в DMA, чтобы сравнить и попытаться купить немного больше процессорного времени между выборками. Увеличение скорости передачи было немного улучшено, но только немного. Это было едва измеримо на o-scope.

Это связано с тем, что на последних микропроцессорах, которые я видел, ISR и DMA работают почти одинаково - они используют циклы ЦП по мере необходимости, а DMA выполняет практически те же операции с ЦП, которые я бы кодировал в эффективном ISR. ,

В редких случаях я видел периферийные устройства, которые имеют собственную область ОЗУ, доступную ТОЛЬКО для DMA. Это было на Ethernet MAC или USB.

кузнец
источник
3

Скорее всего, здесь используется DMA, чтобы ЦАП мог иметь некоторую регулярную синхронизацию, генерировать сигнал путем изменения аналогового выхода через некоторый известный интервал.

Да, если это общий автобус, то ... вы должны поделиться.

Процессор не всегда использует шину, поэтому иногда полезно поделиться с dma engine. И, конечно, это означает, что приоритеты вовлекаются, иногда это просто кто пришел первым (например, иметь команду fifo перед ресурсом и запросы fifo up, в порядке их поступления, да, это не обязательно будет детерминированным ). В таком случае вы можете захотеть, чтобы dma имел приоритет над процессором, чтобы чувствительные ко времени вещи, такие как ЦАП или АЦП, имели детерминированную синхронизацию. Зависит от того, как они решили это реализовать.

Люди иногда имеют это часто неправильное предположение, что дма свободен. Он по-прежнему не использует время шины, если используется совместно с процессором (который, в конечном счете, используется при обращении к ресурсу, с которым процессор может общаться), то процессор и / или dma удерживаются, поэтому процессору все еще приходится ждать время, в некоторых реализациях (вероятно, не ваш микроконтроллер), процессор полностью удерживается до завершения dma, процессор останавливается на время. Просто зависит от реализации. Свободная часть этого состоит в том, что процессор не должен постоянно прерываться или опрашивать или задерживать дыхание, чтобы какое-то событие могло подать данные. Может потребоваться время для создания следующего буфера для dma over. Он должен наблюдать за передачей dma, чтобы завершить и справиться с этим, но вместо того, чтобы сказать, что каждый байт теперь представляет собой несколько байтов, некоторый блок данных.

Нет единого универсального ответа. «Это зависит» ... от конкретного дизайна конкретной вещи, которую вы используете. Даже в рамках одного чипа / платы / системы может быть несколько механизмов dma, и нет никаких оснований предполагать, что все они работают одинаково. Для каждого случая вы должны это выяснить, и, к сожалению, они часто не документируют это или документируют это достаточно хорошо. Так что, возможно, вам придется провести несколько экспериментов, если это вызывает озабоченность.

Старожил
источник
встроенная заметка не имеет к этому никакого отношения. цель dma - повысить производительность, возможно, выполняя работу для процессора, чтобы у него не было кода, а также использовать обычно неиспользуемые циклы шины и работать там. Также для вещей, как в вашем вопросе подачи данных в нужное время, в идеале без затрат ресурсов процессора. эти преимущества полезны встроены или нет.
old_timer
1

Ответы пока говорят о «скорости», с которой процессор может работать, и о преимуществах DMA. Однако есть еще одно соображение, власть .

Если ЦП хотел бы отправить пакет данных по медленной линии связи, он должен был бодрствовать большую часть времени при использовании опроса или прерываний, однако основной ЦП может быть в состоянии ожидания, пока выполняется DMA. ,

Ян Рингроз
источник
0

Некоторые процессоры, такие как серия STM32H7, имеют много вариантов ОЗУ и кучу ОЗУ с тесной связью. Наличие отдельных банков ОЗУ позволяет DMA забивать одну партию ОЗУ, в то время как процессор обрабатывает данные в тесно связанном ОЗУ, которое не требует кэширования и не блокируется DMA. Для перемещения данных вы можете использовать MDMA. Я построил радиолокационный набор FMCW, используя один из них. АЦП получают данные IQ от двух входов в один SRAM. Затем я масштабирую данные и выполняю комплексное вычисление с плавающей запятой 256 bin в dtcm ram. Затем FIFO результат в 2d массив в оперативной памяти AXI, используя MDMA.

Я возьму второй FFT 64 бин через FIFO для вектора скорости. Затем я делаю величину комплексных данных и отправляю полученные значения 128 и 64 с плавающей запятой другому H7, используя SPI на частоте 12,5 МГц для обнаружения. Я делаю все это за 4 мс.

Частота дискретизации АЦП составляет 84 кГц, а с использованием передискретизации я получаю разрешение около 18 бит.

Неплохо для процессора общего назначения, работающего только в диапазоне МГц и без внешней оперативной памяти.

Кроме того, большие кэши этого устройства имеют улучшенную производительность для вызовов за пределами dtcm.

Роб Гарнетт
источник