Недавно я делал проект с mbed (LPC1768), используя ЦАП для вывода различных волн. Я прочитал части таблицы, и там говорилось о том, что у него есть DMA для многих периферийных устройств. Казалось, что это было бы полезно, но при дальнейшем чтении я обнаружил, что DMA использует ту же шину данных, что и процессор (что, я думаю, нормально). Означает ли это, что процессор не может взаимодействовать с какой-либо памятью, пока ЦАП получает данные? Кроме того, поскольку у ЦАПа не было буфера (насколько я могу судить) и, следовательно, он очень часто используется в DMA, какой смысл в DMA? Если процессор не может выполнять транзакции памяти, может ли он что-нибудь сделать?
microcontroller
mbed
dma
BeB00
источник
источник
Ответы:
LPC1768 техническое описание я нашел имеет следующие кавычки (курсив мой):
Блок-схема на странице 6 показывает SRAM с несколькими каналами между матрицей AHB, и следующая цитата подтверждает это:
И это подтверждается следующей цитатой:
Поэтому вы можете передавать данные на ваш ЦАП из одного из отдельных блоков SRAM или с другого периферийного устройства, используя основной SRAM для других функций.
Этот тип периферийных DMA-устройств распространен в небольших частях, где интерфейс памяти довольно прост (по сравнению, скажем, с современным процессором Intel).
источник
Коротко говоря, DMA позволяет центральному процессору эффективно вести себя на своей собственной скорости, тогда как периферийные устройства могут эффективно вести себя на своей собственной скорости. Большинство чисел в примере составлены.
Давайте сравним два варианта периодического сбора данных с АЦП:
Давайте перенесем 1000 образцов из АЦП в ОЗУ.
Использование варианта 1: для каждого образца
Давайте представим, что эта функция прерывания состоит из 76 инструкций, вся подпрограмма имеет длину 100 инструкций, предполагая выполнение одного цикла (в лучшем случае). Это означает, что вариант 1 будет тратить 100 000 циклов процессорного времени на выполнение.
Вариант 2: DMA настроен на сбор 1000 образцов АЦП. Давайте предположим, что АЦП имеет аппаратный триггер от счетчика таймера.
Представление всего прерывания (с издержками входа и выхода) - это 100 однократных инструкций. Используя DMA, вы тратите только 100 циклов, чтобы сохранить те же 1000 образцов.
Теперь, каждый раз, когда DMA обращается к шине, да, может возникнуть спор между CPU и DMA. Процессор может даже быть вынужден ждать завершения работы DMA. Но ожидание завершения работы прямого доступа к памяти намного короче, чем привязка процессора к обслуживанию АЦП. Если тактовая частота ядра процессора равна 2x тактовой частоте шины, то процессор может тратить несколько ядерных циклов в ожидании завершения DMA. Это означает, что ваше эффективное время выполнения передачи составляет от 1000 (при условии, что процессор никогда не ждет) до 9000 циклов. Все еще ПУТЬ лучше, чем 100 000 циклов.
источник
Если в данном цикле процессору и контроллеру DMA потребуется доступ к одной и той же шине, то одному или другому придется подождать. Многие системы, однако, содержат несколько областей памяти с отдельными шинами вместе с «мостом» шины, который позволит ЦПУ обращаться к одной памяти, а контроллер DMA - к другой.
Кроме того, многим ЦП может не потребоваться доступ к устройству памяти в каждом цикле. Если ЦПУ обычно требуется доступ к памяти только в двух из трех циклов, устройство DMA с низким приоритетом может использовать циклы, когда шина памяти в противном случае была бы неактивной.
Тем не менее, даже в тех случаях, когда каждый цикл DMA приводит к остановке ЦП для цикла, DMA может быть очень полезным, если данные поступают с достаточно медленной скоростью, чтобы ЦП мог выполнять другие операции между входящими элементами данных. , но достаточно быстро, что накладные расходы должны быть минимизированы. Например, если порт SPI передает данные на устройство со скоростью один байт каждые 16 циклов ЦП, например, прерывание ЦП для каждой передачи может привести к тому, что он почти все свое время будет входить и выходить из подпрограммы обработки прерываний, и ни один делать любую фактическую работу. Однако при использовании DMA издержки могут быть уменьшены до 13%, даже если каждая передача DMA приводит к остановке ЦП в течение двух циклов.
Наконец, некоторые процессоры позволяют выполнять DMA, пока процессор спит. Использование передачи на основе прерываний потребует полного пробуждения системы для каждой передаваемой единицы данных. Однако, используя DMA, контроллер сна может подавать на контроллер памяти пару часов каждый раз, когда поступает байт, но позволяет всему остальному оставаться в спящем режиме, что снижает энергопотребление.
источник
Как программист, DMA является опцией для передачи данных в и из периферийных устройств, которые его поддерживают. Для классического примера смещения большого буфера через последовательное периферийное устройство, такого как SPI или UART, или сбора нескольких выборок из АЦП, у вас есть три способа перемещения этих данных:
Метод опроса. Здесь вы ждете флагов регистра, чтобы позволить вам сдвинуть / вывести следующий байт. Проблема в том, что вы задерживаете все выполнение процессора, ожидая этого. Или, если вам придется делить процессорное время в операционной системе, то ваша передача будет значительно замедлена.
Метод прерывания. Здесь вы пишете подпрограмму обработки прерываний (ISR), которая выполняется с каждой передачей байтов, и вы пишете код в ISR, который управляет передачей. Это более эффективно для ЦП, поскольку ЦП будет обслуживать ваш ISR только при необходимости. Это бесплатно для использования в любое другое время, кроме как в ISR. ISR также является одним из более быстрых вариантов осуществления перевода с точки зрения скорости передачи.
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.
источник
Скорее всего, здесь используется DMA, чтобы ЦАП мог иметь некоторую регулярную синхронизацию, генерировать сигнал путем изменения аналогового выхода через некоторый известный интервал.
Да, если это общий автобус, то ... вы должны поделиться.
Процессор не всегда использует шину, поэтому иногда полезно поделиться с dma engine. И, конечно, это означает, что приоритеты вовлекаются, иногда это просто кто пришел первым (например, иметь команду fifo перед ресурсом и запросы fifo up, в порядке их поступления, да, это не обязательно будет детерминированным ). В таком случае вы можете захотеть, чтобы dma имел приоритет над процессором, чтобы чувствительные ко времени вещи, такие как ЦАП или АЦП, имели детерминированную синхронизацию. Зависит от того, как они решили это реализовать.
Люди иногда имеют это часто неправильное предположение, что дма свободен. Он по-прежнему не использует время шины, если используется совместно с процессором (который, в конечном счете, используется при обращении к ресурсу, с которым процессор может общаться), то процессор и / или dma удерживаются, поэтому процессору все еще приходится ждать время, в некоторых реализациях (вероятно, не ваш микроконтроллер), процессор полностью удерживается до завершения dma, процессор останавливается на время. Просто зависит от реализации. Свободная часть этого состоит в том, что процессор не должен постоянно прерываться или опрашивать или задерживать дыхание, чтобы какое-то событие могло подать данные. Может потребоваться время для создания следующего буфера для dma over. Он должен наблюдать за передачей dma, чтобы завершить и справиться с этим, но вместо того, чтобы сказать, что каждый байт теперь представляет собой несколько байтов, некоторый блок данных.
Нет единого универсального ответа. «Это зависит» ... от конкретного дизайна конкретной вещи, которую вы используете. Даже в рамках одного чипа / платы / системы может быть несколько механизмов dma, и нет никаких оснований предполагать, что все они работают одинаково. Для каждого случая вы должны это выяснить, и, к сожалению, они часто не документируют это или документируют это достаточно хорошо. Так что, возможно, вам придется провести несколько экспериментов, если это вызывает озабоченность.
источник
Ответы пока говорят о «скорости», с которой процессор может работать, и о преимуществах DMA. Однако есть еще одно соображение, власть .
Если ЦП хотел бы отправить пакет данных по медленной линии связи, он должен был бодрствовать большую часть времени при использовании опроса или прерываний, однако основной ЦП может быть в состоянии ожидания, пока выполняется DMA. ,
источник
Некоторые процессоры, такие как серия 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.
источник