У чому сенс DMA у вбудованих процесорах?


17

Я нещодавно робив проект з mbed (LPC1768), використовуючи ЦАП для виведення різних хвиль. Я читав частини даних, і він розповідав про те, як він мав DMA для багатьох периферійних пристроїв. Це здалося, що це буде корисно, але при подальшому читанні я виявив, що DMA використовує ту саму шину даних, що і процесор (що, напевно, є нормальним). Чи означає це, що процесор не може взаємодіяти з будь-яким із запам’ятовувань, коли ЦАП отримує дані? Крім того, оскільки ЦАП не мав буфера (наскільки я міг сказати) і тому доводиться дуже часто DMA, який сенс DMA? Якщо процесор не може робити операції з пам'яттю, чи може він щось робити?


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 на більш швидкісній шині, і два додаткові 16 кБ блоку SRAM, розташовані на окремому підлеглому порті багатошарової матриці 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 циклів витрачаються на введення перерви
  • читати adc (s)
  • зберігати в барані
  • 12 циклів витрачається на вихід з перерви

Зробимо вигляд, що ця функція переривання - 76 інструкцій, вся процедура - 100 інструкцій, припускаючи виконання одного циклу (найкращий випадок). Це означає, що варіант 1 витратить 100000 циклів часу виконання процесора.

Варіант 2: DMA налаштований для збору 1000 зразків АЦП. Припустимо, що АЦП має апаратний тригер із лічильника таймера.

  • ADC та DMA передають 1000 зразків даних у оперативні дані
  • DMA перериває ваш процесор після 1000 зразків
  • 12 циклів витрачаються на введення перерви
  • Код трапляється (скажімо, він повідомляє DMA перезаписати оперативну пам'ять)
  • 12 циклів витрачається на вихід з перерви

Здійснюючи вигляд цілого переривання (з накладними та вихідними накладними) - 100 інструкцій на один цикл Використовуючи DMA, ви витрачаєте лише 100 циклів, щоб зберегти ті ж 1000 зразків.

Тепер, кожного разу, коли DMA отримує доступ до шини, так, між процесором та DMA може виникнути суперечка. Процесор може навіть змушений чекати, коли DMA закінчиться. Але чекати завершення роботи DMA набагато коротше, ніж блокування процесора для обслуговування АЦП. Якщо основна тактова частота процесора - 2x тактова шина, процесор може витратити кілька основних циклів, очікуючи закінчення DMA. Це означає, що ваш ефективний час виконання передачі становить від 1000 (за умови, що процесор ніколи не чекає) і 9000 циклів. І все-таки ШЛЯХ кращий за 100 000 циклів.


2
Важливо зауважити, що оперативна пам’ять - не єдине місце, де процесор може зберігати дані. Загалом процесор завантажує дані з оперативної пам'яті в регістри, перш ніж працювати над ними.
Арон

Так, абсолютно правильно. Мій приклад - чисто груба замальовка.
pgvoorhees

Багато мікроконтролерів також мають багатошарову шину, тому можливі одночасні операції. Напр .: adc-> ram і flash-> реєструйте одночасно. Крім того, багато інструкцій довші, ніж 1 годинник, тому часу для DMA є багато часу.
Jeroen3

9

Якщо в заданому циклі процесору та DMA-контролеру знадобиться отримати доступ до тієї ж шини, то одному чи іншому доведеться почекати. Однак багато систем містять декілька областей пам’яті з окремими шинами разом з «мостом» шини, що дозволить ЦП отримати доступ до однієї пам’яті, поки контролер DMA має доступ до іншого.

Крім того, багатьом процесорам, можливо, не потрібно мати доступ до пристрою пам'яті на кожному циклі. Якщо процесору, як правило, потрібно отримати доступ до пам'яті лише за два з трьох циклів, пристрій DMA з низьким пріоритетом може мати змогу використовувати цикли, коли шина пам'яті в іншому випадку буде простоювати.

Навіть у тих випадках, коли кожен цикл DMA спричинятиме затримку центрального процесора для циклу, однак, DMA може все-таки бути дуже корисним, якщо дані надходять із швидкістю, що є досить повільною, щоб процесор міг робити інші речі між вхідними елементами даних , але досить швидко, щоб накладні витрати за окремим товаром потрібно мінімізувати. Якщо, наприклад, порт SPI подає дані на пристрій зі швидкістю один байт кожні 16 циклів процесора, наприклад, переривання процесора для кожної передачі, ймовірно, призведе до того, що він витратить майже весь свій час на введення та повернення з режиму обслуговування переривання, і жодного виконуючи будь-яку фактичну роботу. Однак, використовуючи DMA, накладні витрати можуть бути зменшені до 13%, навіть якщо кожна передача DMA призвела до зупинки процесора протягом двох циклів.

Нарешті, деякі процесори дозволяють виконувати DMA під час сну. Використання передачі на основі переривання вимагатиме, щоб система повністю прокинулась для кожної одиниці переданих даних. Однак, використовуючи DMA, регулятор сну може подати контролеру пам’яті пару годин кожного разу, коли входить байт, але нехай все інше залишається спати, тим самим зменшуючи енергоспоживання.


1
Частини Cortex-M, такі як LPC1768, мають чіткий шлях пам’яті від спалаху до декодера інструкцій, тому насправді операції «реєстрація до реєстрації» можуть означати, що процесор може виконувати кілька інструкцій між тим часом, коли йому потрібен доступ до пам'яті даних.
Кріс Страттон

5

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

  1. Метод опитування. Тут ви чекаєте на реєстраційні прапори, щоб ви могли змістити наступний байт. Проблема полягає в тому, що ви затримуєте все виконання процесора, поки чекаєте цього. Або, якщо вам доведеться ділити час процесора в операційній системі, то ваша передача буде різко сповільнена.

  2. Метод переривання. Тут ви пишете процедуру обслуговування переривань (ISR), яка виконується з кожним байтовим переносом, і ви пишете код в ISR, який управляє передачею. Це більш ефективно CPU, оскільки ЦП буде обслуговувати ваш ISR лише в разі потреби. Він безкоштовний для використання у будь-який інший час, крім ISR. ISR також є одним із швидших варіантів здійснення переказу з точки зору швидкості передачі.

  3. DMA. Ви налаштовуєте DMA з покажчиками джерела / призначення, кількістю передач та поза ним. Це вкраде цикли шин і час процесора для здійснення передачі, а процесор вільний робити інші речі в середній час. Ви можете налаштувати прапор або перервати, щоб вказати, коли передача виконана. Зазвичай це сенсор швидше, ніж ISR, і зазвичай це найшвидший варіант передачі.

Як програміст, я віддаю перевагу DMA, тому що це найпростіший код і, по суті, це найшвидша техніка для здійснення передачі. Зазвичай вам потрібно просто налаштувати пару регістрів для покажчиків джерела / місця призначення та кількості передач, щоб зробити їх і вимкнути. Я витрачаю набагато більше годин, працюючи в коді ISR, ніж у коді, прискореному DMA, тому що код ISR вимагає критичних навичок проектування, і його потрібно кодувати, перевіряти, перевіряти тощо. є відносно тривіальною, і я отримую максимальну швидкість передачі в угоді.

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

Це тому, що на останніх мікропроцесорах, які я бачив, ISR і DMA працюють майже однаково - вони беруть цикли процесора, як потрібно, і DMA робить по суті ті ж операції з процесором, що і я був би закодований в ефективному ISR .

У рідкісних випадках я бачив периферійні пристрої, які мають власну зону оперативної пам’яті, яка була ТОЛЬКО доступною DMA. Це було на Ethernet MAC або USB.


3

DMA, швидше за все, використовується тут, щоб ЦАП міг мати певні регулярні моменти часу, генерувати форму хвилі, змінюючи аналоговий вихід на деякий відомий інтервал.

Так, якщо це спільний автобус, то ... ви повинні поділитися.

Процесор не завжди використовує шину, тому іноді корисно поділитися з dma двигуном. І, звичайно, це означає, що пріоритети повинні бути залучені, іноді це саме той, хто першим потрапив (наприклад, майте команду fifo перед ресурсом та виконайте запити, в тому порядку, коли вони надійдуть, так, це не обов'язково-детерміновано ). У такому випадку, можливо, ви хочете, щоб dma мав пріоритет над процесором, щоб такі речі, як ЦАП або АЦП, що залежать від часу, мали детерміновані терміни. Залежить від того, як вони вирішили це здійснити.

Люди часто мають таке неправильне припущення, що dma вільна. Це не все-таки витрачає час на автобус, якщо його поділяють з процесором (який він, зрештою, відбувається під час спілкування з ресурсом, на якому може говорити процесор), тоді процесор і / або dma затримуються, тому процесор все ще повинен почекати час, у деяких реалізаціях (швидше за все, це не ваш мікроконтролер) процесор повністю затримується до завершення dma, процесор зупиняється на час. Просто залежить від реалізації. Вільна частина цього полягає в тому, що процесор не повинен постійно перебиватися, опитуватися чи затримувати дихання на якусь подію для подачі даних. Щоб створити наступний буфер для dma, може знадобитися час. Слід спостерігати за завершенням передачі dma та вирішувати це, але замість того, щоб говорити кожен байт, це тепер кілька байтів, якийсь блок даних.

Універсальної відповіді немає. "Це залежить" ... від конкретного дизайну конкретної речі, яку ви використовуєте. Навіть у межах одного дизайну мікросхем / плати / системи може бути декілька dma двигунів, і немає підстав припускати, що вони працюють однаково. Для кожного екземпляра ви повинні це розібратися, і, на жаль, вони часто не документують його або документують досить добре. Тож вам, можливо, доведеться створити кілька експериментів, якщо це викликає занепокоєння.


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

1

На сьогодні відповіді говорять про "швидкість" процесора може працювати і про те, як DMA виграє від цього. Однак є ще один розгляд, влада .

Якщо центральний процесор хотів би надіслати пакет даних по повільному посиланню, його потрібно було б пробудити більшу частину часу, якщо використовується опитування або переривання, проте головний процесор, можливо, може перебувати в стані сну, поки DMA працює. .


0

Деякі процесори, такі як серія STM32H7, мають багато варіантів оперативної пам’яті та купи оперативної пам'яті. Наявність окремих банків оперативної пам’яті дозволяє DMA забивати один лот оперативної пам’яті, в той час як процесор обробляє дані в тісно зв'язаному барі, який не потребує кешування і не забивається DMA. Для переміщення даних можна використовувати MDMA. Я створив радіолокаційний набір FMCW, використовуючи один із них. АЦП отримує IQ дані з двох входів в одну SRAM. Потім я масштабую дані і виконую з плаваючою точкою 256 бін складний fft у dtcm таран. Потім FIFO отримає результат у 2d масив в AXI таран, використовуючи MDMA.

Я беру другий фут 64 бін через фіфо для вектора швидкості. Потім я виконую величину складних даних і надсилаю отримані дані значення 128 та 64 з плаваючою точкою на інший Н7, використовуючи SPI на 12,5 МГц для виявлення. Я роблю все це за 4 мс.

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

Непогано для процесорів загального призначення працює лише в діапазоні МГц і без зовнішньої оперативної пам’яті.

Також допомагають великі кеші цього пристрою, які покращують продуктивність для calcs поза dtcm.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.