Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: тормозит DMA - 2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
777777
Выводится аналоговый сигнал в ЦАП с помощью DMA. Довольно интенсвно, через 264 нс. Пока работает только он, сигнал ровный. Но стоит запрограммировать любую другую периферию с прерываниями, как сигнал начинает тормозиться, увеличивается его период, появляются искажения. Причем только если выполянются прерывания. Как это может быть? Разве DMA не может захватить шину в любой нужный ему момент времени? Или при обработке прерывания запрещаются не только другие прерывания, но и DMA?
Flexz
Наверное дело все-таки не в самих прерываниях, а в том, что когда появляется работающий код, DMA начинает делить шины с ядром и другой периферией. А арбитраж-то по схеме round-robin.
777777
Цитата(Flexz @ Oct 13 2011, 11:14) *
Наверное дело все-таки не в самих прерываниях, а в том, что когда появляется работающий код, DMA начинает делить шины с ядром и другой периферией. А арбитраж-то по схеме round-robin.

С точки зрения процессора работающий код ничем принципиально не отличается от бесконечного цикла. И дело именно в прерываниях, когда то же самое устройство опрашиваю программно по готовности, то DMA продолжает исправно работать.
scifi
Кстати, меня похожий вопрос интересует. Собираюсь выводить на ЦАП 10^7 выборок в секунду. ЦАП внешний, будет висеть на FSMC. Контроллер заложил из серии STM32F200. Если верить описанию bus matrix, там DMA и процессор не должны друг другу мешать, тем более есть FIFO. Надеюсь, не разочаруюсь...
Flexz
Цитата(777777 @ Oct 13 2011, 11:47) *
С точки зрения процессора работающий код ничем принципиально не отличается от бесконечного цикла. И дело именно в прерываниях, когда то же самое устройство опрашиваю программно по готовности, то DMA продолжает исправно работать.

С точки зрения процессора бесконечный цикл это обращение исключительно к памяти команд, которое происходит в обход BusMatrix, т.е. точно никому не мешает. А прерывания отличаются от опроса разве что наличием сохранения/загрузки контекста, вот тут утверждать не буду, но предположу, что блочное сохранение регистров может быть burst-ом на шине.
Юрий_СВ
Цитата(777777 @ Oct 13 2011, 07:15) *
Выводится аналоговый сигнал в ЦАП с помощью DMA. Довольно интенсвно, через 264 нс. Пока работает только он, сигнал ровный. Но стоит запрограммировать любую другую периферию с прерываниями, как сигнал начинает тормозиться, увеличивается его период, появляются искажения. Причем только если выполянются прерывания. Как это может быть? Разве DMA не может захватить шину в любой нужный ему момент времени? Или при обработке прерывания запрещаются не только другие прерывания, но и DMA?

Цитата
13.3 DMA functional description
The DMA controller performs direct memory transfer by sharing the system bus with the
Cortex™-M3 core. The DMA request may stop the CPU access to the system bus for some
bus cycles, when the CPU and DMA are targeting the same destination (memory or
peripheral)
. The bus matrix implements round-robin scheduling, thus ensuring at least half
of the system bus bandwidth (both to memory and peripheral) for the CPU.

Может дело в том что именно в прерывании идёт обращение к тому же куску адресного пространства (или шине), на которое претендует и ПДП. И поэтому только здесь происходит чередование.
777777
Цитата(scifi @ Oct 13 2011, 12:22) *
Кстати, меня похожий вопрос интересует. Собираюсь выводить на ЦАП 10^7 выборок в секунду.

10 MHz? И не пытайся.
Цитата(scifi @ Oct 13 2011, 12:22) *
Контроллер заложил из серии STM32F200.

200-й конечно побыстрее немного. Попробуй, нам расскажешь.
Цитата(scifi @ Oct 13 2011, 12:22) *
ЦАП внешний, будет висеть на FSMC.

А зачем FSMC? Проще к порту прицепить и пусть DMA туда кидает слова. Кстати, а ЦАП какой?

Цитата(Flexz @ Oct 13 2011, 12:29) *
С точки зрения процессора бесконечный цикл это обращение исключительно к памяти команд, которое происходит в обход BusMatrix

И правда - ведь ICode сделана отдельной.
scifi
Цитата(777777 @ Oct 13 2011, 14:07) *
10 MHz? И не пытайся.

Поясни.

Цитата(777777 @ Oct 13 2011, 14:07) *
200-й конечно побыстрее немного.

Советую поискать 10 различий между STM32F100 и STM32F200. Кое-что нетривиальное добавилось. А именно: bus matrix с одновременным доступом (не блокирующий), DMA FIFO.

Цитата(777777 @ Oct 13 2011, 14:07) *
А зачем FSMC? Проще к порту прицепить и пусть DMA туда кидает слова. Кстати, а ЦАП какой?

Время записи в GPIO неизвестно. Про FSMC гораздо больше ясности. Кроме того, FSMC не будет конфликтовать с другой периферией (см. схему bus matrix). Возможно, попробую и то, и другое.
ЦАП AD5424.
Flexz
Цитата(scifi @ Oct 13 2011, 14:25) *
Время записи в GPIO неизвестно.

Кстати, первое что сделал получив плату с stm32f217 - банальный ногодрыг, 60Мгц вывелись вполне успешно (без цикла, просто большая пачка последовательных записей в регистр)
scifi
Цитата(Flexz @ Oct 13 2011, 16:30) *
Кстати, первое что сделал получив плату с stm32f217 - банальный ногодрыг, 60Мгц вывелись вполне успешно (без цикла, просто большая пачка последовательных записей в регистр)

Отличная новость! Спасибо.
777777
Цитата(scifi @ Oct 13 2011, 14:25) *
Советую поискать 10 различий между STM32F100 и STM32F200. Кое-что нетривиальное добавилось. А именно: bus matrix с одновременным доступом (не блокирующий), DMA FIFO.

Я пока знаю только то, что у него больше частота.
Цитата(scifi @ Oct 13 2011, 14:25) *
ЦАП AD5424.

Но это же всего 8 бит?!
Dron_Gus
Вероятно во время входа в прерывание процессор скопом сохраняет регистры и в этот момент DMA не может пробиться к памяти.
ZiB
какая частота ядра?
777777
Цитата(Dron_Gus @ Oct 15 2011, 19:48) *
Вероятно во время входа в прерывание процессор скопом сохраняет регистры и в этот момент DMA не может пробиться к памяти.

А как сохранение регистров может этому помешать? Почему бы DMA не прервать этот процесс посередине?

Цитата(ZiB @ Oct 16 2011, 08:38) *
какая частота ядра?

Обычная - 72 МГц
Oleg Galizin
Может кроме DMA использовать таймер дополнительно. ДМА будет писать в теневой регистр. По таймеру аппаратно будет запускаться DAC - данные из теневого регистра будут переноситься регистр DAC. Нужно реализовать небольшое отставание записи данных в DAC от запуска самого преобразования. Тогда сигнал будет выводится с отставанием почти в период, зато случайные небольшие задержки не будут влиять на результат - есть почти целый период, что бы выполнить эту операцию.
Если ЦАП внешний возможно придется организовать внешнюю защелку. Из защелки в DAC данные должны попадать по сигналу таймера (ШИМ).
scifi
Цитата(scifi @ Oct 13 2011, 12:22) *
Кстати, меня похожий вопрос интересует. Собираюсь выводить на ЦАП 10^7 выборок в секунду. ЦАП внешний, будет висеть на FSMC. Контроллер заложил из серии STM32F200. Если верить описанию bus matrix, там DMA и процессор не должны друг другу мешать, тем более есть FIFO. Надеюсь, не разочаруюсь...

Докладываю: всё работает.
STM32F20x. ЦАП параллельный 8 бит (AD5424) сидит на GPIO. Данные загоняются через DMA. Синхроимпульс - от таймера. 20x10^6 выборок в секунду (по паспорту ЦАПа) - работает без проблем.
maksimp
Цитата(777777 @ Oct 13 2011, 08:15) *
Выводится аналоговый сигнал в ЦАП с помощью DMA. Довольно интенсвно, через 264 нс. Пока работает только он, сигнал ровный. Но стоит запрограммировать любую другую периферию с прерываниями, как сигнал начинает тормозиться, увеличивается его период, появляются искажения. Причем только если выполянются прерывания.

Цитата(777777 @ Oct 17 2011, 09:59) *
Обычная - 72 МГц

У меня на stm32f107, DMA (правда у меня DMA1 использован) нормально выводит в порт каждые 10 тактов, по сигналу от TIM1. Может выводить и каждые 9 тактов, но тогда иногда работает не чётко (возможно, в зависимости от прерываний). Выводить каждые 8 тактов не получается.
У вас 264 нс при 72 МГц - это 1 вывод в 19 тактов. Странно, что не получается. Или может 264 нс - это период сигнала на выходе ЦАП, а выводите в порт в 2 раза чаще?
Flexz
Цитата(scifi @ Oct 25 2011, 13:14) *
Докладываю: всё работает.
STM32F20x. ЦАП параллельный 8 бит (AD5424) сидит на GPIO. Данные загоняются через DMA. Синхроимпульс - от таймера. 20x10^6 выборок в секунду (по паспорту ЦАПа) - работает без проблем.

А сам процессор при этом что-нибудь делает или спит?
scifi
Цитата(Flexz @ Oct 26 2011, 11:30) *
А сам процессор при этом что-нибудь делает или спит?

Крутится в цикле while (1) {}.
Чуть позже прикручу сбор данных с АЦП и их обработку. Мануал обещает, что DMA и процессор друг другу мешать не будут. Будут результаты - доложу.
scifi
Собственно, продолжение отчёта.
Добавил сбор данных через АЦП. Оцифровка 625 тыс. выборок в секунду. Заполнение буфера при помощи того же DMA2. Далее данные из буфера АЦП усредняются и обрабатываются. Замедления работы процессора не замечено.
Когда задействованы два канала DMA, часть периода на выходе ЦАП искажается: туда через DMA как-то просачиваются данные с АЦП. Возможно, режим circular имеет к этому отношение. Поскольку у меня заполнен не весь период, то я просто при помощи таймеров отрезал от внешнего ЦАП испорченную часть периода.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.