Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 09.03.2017, 18:17   #1
jur2002
Junior Member
 
Регистрация: 07.05.2016
Сообщений: 7
Вес репутации: 140/0
jur2002 will become famous soon enoughjur2002 will become famous soon enough
По умолчанию PIC32MX: Как сделать передачу блока данных из PMP через DMA

Приветствую!

Я разрабатываю устройство на PIC32MX795F512L. Программу для микроконтроллера создаю в MPLAB X IDE v3.50 с помощью Harmony v1.09. Опыта работы с этими микроконтроллерами не имею.

У меня следующая задача. Нужно управлять внешней ПЛИС и считывать из нее блоки данных размером 1 кбайт. Далее эти данные посылаются в компьютер посредством Ethernet с помощью канала UDP (как наиболее быстрого). Все работает нормально, однако возникла необходимость немного ускорить получение данных из ПЛИС. Сейчас у меня выходит, что считывание данных из ПЛИС занимает примерно в 2.5-3 раза больше времени нежели их передача по сети. Хотелось бы ускорить считывание этих данных.

Проведя некоторый анализ я выяснил, что программное считывание данных из PMDIN и их запись в буфер памяти производится слишком медленно. Естественно возникла идея осуществить эту операцию с применением DMA. В документе "PIC32 Family Reference Manual, Sect. 13 Parallel Master Port (файл 60001128H.pdf)" этому вопросу посвящен целый раздел 13.10. Но сказать, что там критически мало слов - это ничего не сказать... Те несколько предложений, что там изложены, совсем не помогают.

Поэтому у меня возник такой вопрос: как же все-таки сделать передачу блока данных из PMP в память посредством DMA?

Исходные условия таковы:
1. Блоки данных считываются через 16-битную шину.
2. Размер одной порции (блока) данных 512 слов.
3. Шина адреса совсем не нужна.
4. Никаких прерываний не нужно, просто заходим в функцию, запускаем считывание, ждем завершения и выходим.

В разделе 13.10 сказано, что триггером для DMA должен служить сигнал прерывания готовности слова из PMP. Можно ли в этом случае в контроллере прерываний этого прерывания не включать, а использовать его сигнал только для запуска DMA? Как аппаратно организовать запуск считывания следующего слова после получения предыдущего? Расскажите, пожалуйста по шагам, как вообще это осуществить? Ведь, насколько я понимаю, моя задача вполне тривиальна, но я этого делать еще не умею.

Помогите, пожалуйста!
jur2002 вне форума   Ответить с цитированием
Старый 09.03.2017, 19:30   #2
jur2002
Junior Member
 
Регистрация: 07.05.2016
Сообщений: 7
Вес репутации: 140/0
jur2002 will become famous soon enoughjur2002 will become famous soon enough
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

P.S. Еще забыл дописать. В разделе "13.5.1Interrupt Configuration" насторожило следующее предложение:

It is the responsibility of the user’s software routine that services a particular interrupt to clear the appropriate Interrupt Flag bit before the service routine is complete.

Это что получается? Без прерывания не обойтись? А это не замедлит весь процесс настолько, что получится такая же скорость, как и при программном считывании?
jur2002 вне форума   Ответить с цитированием
Старый 09.03.2017, 21:19   #3
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

jur2002
Как аппаратно организовать запуск считывания следующего слова после получения предыдущего? - pmmode IRQM = 01 Interrupt generated at the end of the read/write cycle.

Это что получается? Без прерывания не обойтись? - не понятно о чем Вы. нет, у Вас не получится писать нормальные программы без прерываний, но это вряд-ли напрямую связано со считыванием блоков данных с помощью dma.
besogon вне форума   Ответить с цитированием
Старый 10.03.2017, 10:54   #4
varostov
Senior Member
 
Аватар для varostov
 
Регистрация: 14.11.2007
Адрес: Ростов-на-Дону
Возраст: 51
Сообщений: 129
Вес репутации: 419/40
varostov is just really nicevarostov is just really nicevarostov is just really nicevarostov is just really nicevarostov is just really nice
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

Я не специалист по PIC32MX, но есть среди отладочных средств Microchip плата + appnote + примеры, где с помощью DMA обслуживается TFT дисплей, а это даже в случае 320х240 немаленькие скорости. Посмотрите, может там почерпнёте методологию...

AN1387
Low-Cost Controllerless (LCC) Graphics PICtail Plus Daughter Board
Low-Cost Controllerless (LCC) Graphics Webinar
varostov вне форума   Ответить с цитированием
Старый 10.03.2017, 18:02   #5
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Фрязино, М.О.
Возраст: 57
Сообщений: 1,775
Вес репутации: 2135/74
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

Цитата:
Сообщение от jur2002 Посмотреть сообщение
В разделе 13.10 сказано, что триггером для DMA должен служить сигнал прерывания готовности слова из PMP.
Практически все источники запросов на транзакции в ДМА генерируются из тех же сигналов, что и флаги соответствующих прерываний, но сигналы запросов (триггеры) ДМА самими флагами НЕ ЯВЛЯЮТСЯ. То есть не требуется обслуживать флаги прерываний или, тем более, включать разрешение прерываний (разрешения вообще никакого отношения к генерации флагов не имеют и в цепочке самого контроллера прерываний МК расположены ПОСЛЕ схемы генерации флагов).
Марк вне форума   Ответить с цитированием
Старый 10.03.2017, 18:05   #6
jur2002
Junior Member
 
Регистрация: 07.05.2016
Сообщений: 7
Вес репутации: 140/0
jur2002 will become famous soon enoughjur2002 will become famous soon enough
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

Цитата:
Сообщение от besogon Посмотреть сообщение
jur2002
pmmode IRQM = 01 Interrupt generated at the end of the read/write cycle.
Да, получается, что этот сигнал прерывания вырабатывает контроллер прерываний, а PIC только указывает, что этот сигнал нужно вырабатывать. Придется сделать маленькую функцию, которая будет этот сигнал сбрасывать.

Цитата:
Сообщение от besogon Посмотреть сообщение
jur2002
нет, у Вас не получится писать нормальные программы без прерываний, но это вряд-ли напрямую связано со считыванием блоков данных с помощью dma.
Как я написал в самом начале, моя задача довольно тривиальна, мне прерывания без надобности. Вся логика устройства реализуется в компьютере, а микроконтроллер должен только управлять ПЛИС да получать/отправлять блоки данных. Правда, модуль TCP/IP сам породил функцию для обработки своих прерываний. Ну и, просто для удобства, я еще включил прерывания 1-миллисекундного таймера (удобно для отлавливания ошибочных таймаутов).

Цитата:
Сообщение от varostov Посмотреть сообщение
Посмотрите, может там почерпнёте методологию...
AN1387
Low-Cost Controllerless (LCC) Graphics PICtail Plus Daughter Board
Low-Cost Controllerless (LCC) Graphics Webinar
Да, спасибо большое! Правда эти микрочиповские документы отличаются заметной многословностью при почти полном отсутствии понятной информации :-) Особенно это касается документации по Harmony...

Спасибо! Буду разбираться дальше.

P.S.
Цитата:
Сообщение от Марк Посмотреть сообщение
Практически все источники запросов на транзакции в ДМА генерируются из тех же сигналов, что и флаги соответствующих прерываний, но сигналы запросов (триггеры) ДМА самими флагами НЕ ЯВЛЯЮТСЯ. То есть не требуется обслуживать флаги прерываний или, тем более, включать разрешение прерываний (разрешения вообще никакого отношения к генерации флагов не имеют и в цепочке самого контроллера прерываний МК расположены ПОСЛЕ схемы генерации флагов).
Это понятно. Я во втором посте про это написал. В документе про PMP об этом говорится.

Последний раз редактировалось jur2002; 10.03.2017 в 18:09. Причина: Добавлен P.S.
jur2002 вне форума   Ответить с цитированием
Старый 10.03.2017, 22:32   #7
jur2002
Junior Member
 
Регистрация: 07.05.2016
Сообщений: 7
Вес репутации: 140/0
jur2002 will become famous soon enoughjur2002 will become famous soon enough
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

Кстати, друзья, а вас не напрягает, что в документе про DMA не приводятся временнЫе диаграммы работы этого важнейшего узла микроконтроллера? И в Family Data Sheet про это ничего нет? IMHO, беспрецедентный случай... Опять же, этот треклятый PMP. В какой момент, на каком конкретно такте производится считывание/запись слова данных? Вот возник запрос прерывания, DMA запускает свой цикл считывания. Как, когда, на каком такте, сколько это длится?... Как там у классика? "Документации много. Ее очень много и в случае катастрофы ее хватит на всех! Просто нет той, что подходит! По сравнению с той, которая есть!" (С) (перефраз. М.Жванецкий)
jur2002 вне форума   Ответить с цитированием
Старый 12.03.2017, 10:07   #8
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,314
Вес репутации: 2626/57
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

jur2002
что у Вас конкретно не работает?
какие-то диаграммы там точно есть.

Да, получается, что этот сигнал прерывания вырабатывает контроллер прерываний, а PIC только указывает, что этот сигнал нужно вырабатывать. Придется сделать маленькую функцию, которая будет этот сигнал сбрасывать. - зачем? какой еще сигнал сбрасывать? в pic32mx цепи IRQ идут свои в DMA и CORE. флаг у Вас живет только в CORE. в DMA никаких флагов нет и, закономерно, ничего сбрасывать не надо.

В какой момент, на каком конкретно такте производится считывание/запись слова данных? - в настройке матрицы шин указывается арбитраж доступа к шине. в какой-то момент, очевидно. если у Вас приоритет ядра на доступ к шине, то если выполняется сплошные lw,lw,lw,lw последовательности, то DMA вообще не будет ничего успевать, если у Вас приоритет DMA, то у Вас когда DMA быстро работает, a core нужен доступ к памяти, то core пузырьков в конвеер навставляет.
besogon вне форума   Ответить с цитированием
Старый 23.03.2017, 18:56   #9
jur2002
Junior Member
 
Регистрация: 07.05.2016
Сообщений: 7
Вес репутации: 140/0
jur2002 will become famous soon enoughjur2002 will become famous soon enough
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

Друзья! Большое вам спасибо, вы мне здорово помогли!

Но обо всем по порядку. После некоторого перерыва из-за других забот я продолжил свою борьбу. Скажу сразу: досконально разобраться со всякими тактами мне не удалось. Но, как говорится, на вопрос: "Вам шашечки, или ехать?" я выбрал второе. Очень здорово меня подтолкнул в правильном направлении пост уважаемого коллеги besogon. А именно, его слова о разных путях цепей IRQ. Хочу поделиться своим скромным опытом с коллегами, которым вопрос работы PMP с DMA еще не совсем понятен. Итак.

С самого начала меня смутило описание работы с DMA в документе "PIC32 Family Reference Manual, Sect. 13 Parallel Master Port (60001128H).pdf", раздел 13.10. Там сказано, что нужно включить прерывание PMP. ОК, включаем, но в разделе 13.5.1 написано, что нужно сбрасывать флаг PMPIF. Благодаря уважаемому коллеге besogon я понял, что ничего сбрасывать не нужно, ведь прерываний я использовать не буду за ненадобностью.

Далее я обратился к документу "PIC32 Family Reference Manual, Sect. 31 DMA Controller (60001117H).pdf", в разделе 31.3.1 которого я прочитал очень неявную (для меня) вещь: обязательно нужно еще включить флаг SIRQEN! Немного далее приведен пример кода инициализации канала DMA, где однако ничего не говорится о флаге SIRQEN. (Естественно, ведь приведенный пример рассчитан на передачу память-память.) Возможно вам, друзья, мои блуждания покажутся наивными, но что поделаешь?! Шишки-то набивать приходится самому! :-) Именно поэтому у меня и возникло желание поделиться своим маленьким опытом с другими, такими же начинающими.

Вот мой код инициализации считывания блока данных из PMP в буфер памяти. За основу я взял код из раздела 31.3.1 документа о DMA.
Код:
int DMA_Module_Start(const void *destAddr, size_t destSize)
{
    IEC1CLR   = 0x00010000; // disable DMA channel 0 interrupts
    IFS1CLR   = 0x00010000; // clear existing DMA channel 0 interrupt flag

    DMACONSET = 0x00008000; // enable the DMA controller
    DCH0CON   = 0x3;        // channel off, priority 3, no chaining
    
    __DCH0ECONbits_t ch0econ;
    ch0econ.w = 0;
    ch0econ.CHSIRQ = 34;   // Parallel Master Port IRQ number
    ch0econ.SIRQEN = 1;
    DCH0ECON = ch0econ.w;  // enable trigger on PMP cycle done interrupt

    // Program the transfer
    // Source is PMDIN register (2 bytes size)
    DCH0SSA  = ConvertToPhysicalAddress(&PMDIN);
    DCH0SSIZ = 2;
    DCH0DSA  = ConvertToPhysicalAddress(destAddr);
    DCH0DSIZ = destSize;
    DCH0CSIZ = 2; // 2 bytes transferred per event (cell size)

    DCH0INTCLR = 0x00ff00ff; // clear existing events, disable all interrupts
    DCH0CONSET = 0x80;       // turn channel on, priority 3, no chaining

    return 0;
}
В том месте программы, где DMA применяется, код выглядит так:
Код:
    PMP_Module_dummy_word = PMDIN; // Dummy read to get read started
    int error = DMA_Module_Start( (void *) data, data_len*2 );
    if( error != 0 ) return;
    while( true )
    {
        register int pollCnt; // use a poll counter.
                              // continuously polling the DMA controller in a tight
                              // loop would affect the performance of the DMA transfer
        int dmaFlags = DCH0INT;
        if(dmaFlags & 0xb)
        {          // one of CHERIF (DCHxINT<0>), CHTAIF (DCHxINT<1>)
                   // or CHBCIF (DCHxINT<3>) flags set
            break; // transfer completed
        }
        pollCnt = 100;      // use an adjusted value here
        while( pollCnt-- ); // wait before reading again the DMA controller
    }
Обратите внимание на первую строку! Из-за особенностей микрочиповского PMP нужно прочитать первое слово данных, которое остается от прежнего цикла, и его следует отбросить.

Пока все. Только повторю, что я работаю в MPLAB X IDE v3.50 с помощью Harmony v1.09.

Большое вам спасибо за помощь, друзья! Мой канал считывания данных теперь работает немного быстрее и укладывается в новые требования ТЗ.
jur2002 вне форума   Ответить с цитированием
Старый 10.04.2017, 14:05   #10
vladtv
Senior Member
 
Регистрация: 27.02.2007
Сообщений: 123
Вес репутации: 100/40
vladtv will become famous soon enoughvladtv will become famous soon enough
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

А можно-ли в целях "повышения образованности" ознакомиться с кодом инициализации самого PMP для вашего случая ?
vladtv вне форума   Ответить с цитированием
Старый 19.04.2017, 11:04   #11
jur2002
Junior Member
 
Регистрация: 07.05.2016
Сообщений: 7
Вес репутации: 140/0
jur2002 will become famous soon enoughjur2002 will become famous soon enough
По умолчанию Re: PIC32MX: Как сделать передачу блока данных из PMP через DMA

Цитата:
Сообщение от vladtv Посмотреть сообщение
А можно-ли в целях "повышения образованности" ознакомиться с кодом инициализации самого PMP для вашего случая ?
Прилагаю ZIP-архив моего кода. Я специально не "чистил" код, чтобы сохранить мои "метания". Т.к. они быстро забываются, и потом приходится мучительно вспоминать: "Так какого же черта я это написал?!" :-)

Для такого новичка как я представляют интерес следующие флаги:

#define USE_INLINE_BLOCK_READ 0
#define USE_DMA_BLOCK_READ 1

Первый введен для опробования вариантов inline и не inline считывания блоков. Путем замеров я увидел, что inline вариант чуток медленнее.

Второй флаг - для сравнения скорости работы программного считывания и с помощью DMA. Вот тут я и получил необходимое мне ускорение передачи.

Есть еще флаг USE_ALE_SIGNAL, но он связан с нашими заморочками с ПЛИС. Понятно, что лишний импульс (ALE) в цикле передачи данных в/из PMP замедляет работу. Поэтому мы от него отказались. Это, в свою очередь, потребовало небольшого изменения кода.

Функции записи/считывания регистров оставлены inline и программными, т.к. скорость их работы мне до-лампочки: используются только для задания режимов работы ПЛИС и на критичный процесс передачи данных не влияют.
Вложения
Тип файла: zip PMP_Module.zip (3.3 Кб, 4 просмотров)
jur2002 вне форума   Ответить с цитированием
Ответ

Метки
dma, pic32mx, pmp


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из считанной прошивки PIC18 сделать hex ? kapushindra Вопросы начинающих 12 05.01.2015 01:11
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
Как из SD карты сделать MMC? Agafonov Общетехнические вопросы 13 05.03.2011 22:05


Часовой пояс GMT +3, время: 23:19.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot