Перейти к содержанию
    

AT91RM9200: быстрая пересылка память-память

А вот мне кажется, что атмел череcчур упорно лепит повсюду свой PDC, забывая, что некоторой периферии желательно еще и FIFO.

+1

Что самое смешное с USB ситуация как раз прямо противоположная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как-то наткнулся у Intel на статейку, где сравнивается использование FIFO и DMA. Советую почитать.

27242701.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При приеме- тоже грустно. из FIFO обязательно нужно выгребать,

Чуть-чуть глянем подальше, но начном сначала

- FIFO нужно "выгребать", а DMA (уже писал) "само", но у контроллер без кэшей и отдельных банков

на отдельной переферийной шине просто "стоит".

а PDC уже сразу кладет данные туда, куда мне нужно.

А свой тему топика поднятую Вами помните? Что-то мне подсказывает, что DMA положил Вам

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

А уж только после этого положить не тольлько куда надо, но и то, что надо. Обработка сырого потока

так или иначе нужна почти всегда, с DMA получаете дополнительные пересылки память-память буквально на ровном месте.

Можете привести пример, когда FIFO позволит сэкономить количество обращений с памятью?

См. Выше.

 

 

Как-то наткнулся у Intel на статейку, где сравнивается использование FIFO и DMA. Советую почитать.

Реально много работал с AMD186CC, тот-же UART (кстати много более продвинутый нежели от

Intel и 32bit интерфейсом и прочими вкусностями) имеет и FIFO и DMA. Пробовал, думал....

в результате работает с FIFO. Причины изложены выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А свой тему топика поднятую Вами помните? Что-то мне подсказывает, что DMA положил Вам

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

 

Реально много работал с AMD186CC, тот-же UART (кстати много более продвинутый нежели от

Intel и 32bit интерфейсом и прочими вкусностями) имеет и FIFO и DMA. Пробовал, думал....

в результате работает с FIFO. Причины изложены выше.

 

У меня получилась противоположная ситуация (UART на SAM7S). Мой протокол (который я разрабатывал еще под MSP430) идеально лег на PDC.

Хитрость следующая: обмен идет пакетами данных. Данные внутри пакета идут без пауз, между пакетами вставляются паузы длиной не менее одного символа. В итоге я просто программирую UART на прием с тайм-аутом (регистр US_RTOR), а PDC - на прием максимально допустимой длины пакета. Дальше, обнаружив в основном цикле программы флаг RX_BUFF или TIMEOUT в регистре US_CSR я проверяю правильность принятого пакета (стартовый байт, совпадение длины и контрольной суммы). Вся дальнейшая обработка принятого пакета идет по месту, без лишних пересылок. Передача - аналогично, в памяти формируется пакет и скармливается PDC.

Разумеется, можно придумать вариант протокола, который будет более оптимален при работе с FIFO. Достаточно добавить к нему какой-либо вариант байт-стаффинга или убрать паузы между пакетами.

Изменено пользователем vmp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разумеется, можно придумать вариант протокола, который будет более оптимален при работе с FIFO.

Обычно протоколы "придумывают" совсем с другой целью :-)

Достаточно добавить к нему какой-либо вариант байт-стаффинга или убрать паузы между пакетами.

Далеко и ходить не надо - SLIP - хороший, стандартный и правильный пакетный протокол и будет "туши свет".....

 

Повторюсь :-( Ни FIFO, ни DMA сами по себе не лучше и не хуже, просто довольно часто приходится слышать о DMA (в случае простых контроллеров!) как о чем-то абсолютно прекрасном, так вот это не так, к сожалению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А свой тему топика поднятую Вами помните?

Да. Напоминаю:

Я: спросил, как можно быстрее передать данные, чем через memcpy(), и еще посетовал на отсутствие PDC для этого процесса.

Мне: PDC- это фигня по сравнению с FIFO.

Я: не вижу, чем FIFO лучше чем PDC.

 

 

Что-то мне подсказывает, что DMA положил Вам

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

Как? Где Вы экономите? Я так и не понял. Конкретный пример приведите, как FIFO экономит пересылки при подсчете контрольной суммы? Или как FIFO помогает определить битый пакет?

 

 

А уж только после этого положить не тольлько куда надо, но и то, что надо. Обработка сырого потока

так или иначе нужна почти всегда, с DMA получаете дополнительные пересылки память-память буквально на ровном месте.

Так уж получилось, что я постоянно решаю задачи, в которых обработка сырого потока до момента его полного приема бессмысленна. То есть есть критерии завершения, которые я могу описать контроллеру PDC до начала обмена, и просто ждать прерывания по событию "конец приема". У Вас же, наверное, ситуация обратная.

 

 

Реально много работал с AMD186CC, тот-же UART (кстати много более продвинутый нежели от

Intel и 32bit интерфейсом и прочими вкусностями) имеет и FIFO и DMA. Пробовал, думал....

в результате работает с FIFO. Причины изложены выше.

Ну что ж. А у меня ситуация обратная. Мой протокол хорошо ложится на PDC, вот и все. И FIFO ну никак не облегчит мне жизнь.

 

 

 

Далеко и ходить не надо - SLIP - хороший, стандартный и правильный пакетный протокол и будет "туши свет".....

Ну а если у меня постоянно MODBUS-RTU, который хорошо ложится на имеющийся PDC? Что мне теперь, протокол менять, чтобы неудобно было? :)

 

Повторюсь :-( Ни FIFO, ни DMA сами по себе не лучше и не хуже, просто довольно часто приходится слышать о DMA (в случае простых контроллеров!) как о чем-то абсолютно прекрасном, так вот это не так, к сожалению.

Это да. Нет в мире совершенства. Кому что нравится. Мне- PDC, Вам- FIFO.

:cheers:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. Напоминаю:

Я: спросил, как можно быстрее передать данные, чем через memcpy(), и еще посетовал на отсутствие PDC для этого процесса.

Тогда ВЫНУЖДЕН напомнить свой ответ ПОЛНОСТЬЮ:

Прежде чем 'требовать' подумайте а чем занимается контроллер, когда у него отобрали память?

В памяти оно конечно 'само все пересылается' а процессор просто стоит, если у него конечно нет

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

Это похоже?????? на Вашу интерпретацию моего ответа:

Мне: PDC- это фигня по сравнению с FIFO.

 

Мой протокол хорошо ложится на PDC, вот и все.

Зачем тогда сожаление об отсутствие пересылок память-память? Я полагаю (уже писал), что имеет место быть необходимость после того, как отработало DMA c железом наконец переслать несколько обработанную принятую информацию в "правильное" место. Есть еще какие-то причины? Я лично могу назвать еще только одну - ошибки в проектировании системы приводящие к необходимости такой лишней пересылки.

 

Кому что нравится. Мне- PDC, Вам- FIFO.

Нравится/не нравится это НЕ МОЙ ПОДХОД. Если есть выбор, то я выбираю наиоптимальнейший вариант не руководствуясь понятием "нравится" и стереотипами ( например, по отношению к затронутому здесь

DMA).

Чего и Вам желаю!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. Напоминаю:

Я: спросил, как можно быстрее передать данные, чем через memcpy(), и еще посетовал на отсутствие PDC для этого процесса.

Тогда ВЫНУЖДЕН напомнить свой ответ ПОЛНОСТЬЮ:

Прежде чем 'требовать' подумайте а чем занимается контроллер, когда у него отобрали память?

В памяти оно конечно 'само все пересылается' а процессор просто стоит, если у него конечно нет

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

Это похоже?????? на Вашу интерпретацию моего ответа:

Мне: PDC- это фигня по сравнению с FIFO.

Тогда ВЫНУЖДЕН привести еще один Ваш ответ:

 

Речь вел не о том, что без DMA лучше - с DMA безусловно лучше чем без ничего. А о том, что а Atmel-овской архитетуре DMA отнюдь не более, а менее эффективна, чем "банальные" FIFO.

Извините, Вы действительно не говорили, что "PDC- это фигня по сравнению с FIFO". Вы сказали, что "в Atmel-овской архитетуре DMA отнюдь не более, а менее эффективна, чем "банальные" FIFO".

Вероятно, моя интерпретация этой фразы оказалась слишком вольной.

 

Мой протокол хорошо ложится на PDC, вот и все.

Зачем тогда сожаление об отсутствие пересылок память-память? Я полагаю (уже писал), что имеет место быть необходимость после того, как отработало DMA c железом наконец переслать несколько обработанную принятую информацию в "правильное" место. Есть еще какие-то причины? Я лично могу назвать еще только одну - ошибки в проектировании системы приводящие к необходимости такой лишней пересылки.

Ну зачем так прямолинейно? Предствьте себе более сложную картину мироздания. У меня для работы с некоторой периферией есть PDC, которые я успешно использую. Но также есть и другие устройства, для которых этих PDC нет, а правила работы с устройствами навязаны их производителем.

Конкретно- NAND FLASH. Вот для нее-то мне и не хватает аналогичного контроллера, облегчающего жизнь. Еще пример- пересылка больших объемов (размером с экран) из SDRAM в контроллер дисплея. Тоже очень помогло бы наличие аппаратного "насоса". Вышеупомянутое- пример устройств, так или иначе отображенных на память, и если бы у меня был аппаратных контроллер для пересылок "память-память", он бы довольно хорошо уменьшил требуемое на эти операции время.

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

 

 

Кому что нравится. Мне- PDC, Вам- FIFO.

Нравится/не нравится это НЕ МОЙ ПОДХОД. Если есть выбор, то я выбираю наиоптимальнейший вариант не руководствуясь понятием "нравится" и стереотипами ( например, по отношению к затронутому здесь

DMA).

Согласитесь, под "нравиться" можно подразумевать комплекс причин, влияющих в том числе и на "оптимальность". А под "оптимальностью" можно подразумевать и банальную скорость достижения результата, что запросто может определяться личными предпочтениями программиста. Но это философский вопрос, не будем развивать.

 

Чего и Вам желаю!

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...