alexPec
May 26 2011, 19:36
Добрый день. Вот такая задача, можно ли такое сделать с помощью ДМА:
Нужно отправлять поток в стрим из памяти, но не линейно а так: есть общий массив, который нужно выкинуть в дма. Допустим длина 20000 байт. В этом массиве будет целое число блоков, в данном случае 4. Располагаются так: байты с индексами 0-4999 это 1 блок, 5000-9999 это 2 блок, 10000-14999 это 3 блок, 15000-19999 это 4 блок. Так вот надо байты выкидывать не попорядку, сначала первые байты всех блоков, затем вторые, затем третие и т.д. Т.е. в таком порядке (указываю индексы батов в исходном массиве):
0,5000,10000,15000,1,50001,10001,15001,2,5002,10002,...,4999,9999,14999,19999.
Вроде как очевидное решение - создать еще один массив и туда переупорядочить байты, чтоб дма попорядку выкидывал, но ниос уже это не успеет сделать. Забивать массив изначально в другом порядке тоже не получается. Может поскажет кто как быть?
Спасибо!
vadimuzzz
May 27 2011, 00:56
по-моему самый простой вариант - сделать свой компонент DMA, который сможет несколько дескрипторов параллельно обрабатывать и распределять поток на всех. а какого типа память? если SDRAM, то скорость сильно просядет
alexPec
May 27 2011, 05:57
Цитата(vadimuzzz @ May 27 2011, 04:56)

по-моему самый простой вариант - сделать свой компонент DMA, который сможет несколько дескрипторов параллельно обрабатывать и распределять поток на всех. а какого типа память? если SDRAM, то скорость сильно просядет
Не, не SDRAM, обычная аснхронная, 100Мгц. Вообще так и думал, что нельзя так сгдма завести, просто спросил, а вдруг да кто исхитрился уже такое сделать...
vadimuzzz
May 27 2011, 07:10
Цитата(alexPec @ May 27 2011, 12:57)

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

ну, при желании можно. но не будет никакой экономии ни по ресурсам, ни по времени. лучше нормальный компонент наваять, параметризуемый.
murmel1
May 28 2011, 11:31
Пусть DMA выкидывает адреса чтения подряд. Дальше адрес пропустить через компонент, который будет переставлять биты (если блоки длиной 2^N), либо пересчитывать.
Т.е. на выходе DMA адреса:
0
1
2
3
4
5
6
7
8
...
А на входе контроллера памяти:
0
5 000
10 000
15 000
1
5 001
10 001
15 001
...
+++: Стандартный DMA и несложный компонент.
alexPec
May 28 2011, 19:14
Цитата
Пусть DMA выкидывает адреса чтения подряд. Дальше адрес пропустить через компонент, который будет переставлять биты (если блоки длиной 2^N), либо пересчитывать.
Да, тоже вариант. Спасибо