Jump to content

    

Посылка по DMA

Recommended Posts

jenya7

Можно послать 4К один раз

// Number of bytes to be transfered in each service request of the channel
DMA0->TCD[0].NBYTES_MLNO = 4096;
		
// Current major iteration count 
DMA0->TCD[0].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(1);
DMA0->TCD[0].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(1);

А можно послать 1 байт 4096 раз

// Number of bytes to be transfered in each service request of the channel
DMA0->TCD[0].NBYTES_MLNO = 1;
		
// Current major iteration count 
DMA0->TCD[0].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(4096);
DMA0->TCD[0].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(4096);

Какая разница и что предпочтительней?

Edited by jenya7

Share this post


Link to post
Share on other sites

jenya7
38 minutes ago, Gorby said:

Оптом - дешевле.

 

оптом это первый или второй вариант?

как по мне оба варианта оптом, если флаг DONE выставляется по окончании (minor * major).

Edited by jenya7

Share this post


Link to post
Share on other sites

Gorby
// Number of bytes to be transfered in each service request of the channel

Абстрактно думается, что у каждого service request есть накладные расходы (в том числе неявные, неочевидные для программиста). Точный ответ может дать только точное знание хардверной схемы. Учитывая внутренние шины со своими заморочками, можно (волюнтаристически) предположить, что один большой блок передавать экономнее. А на пальцах, в конкретной ситуации просто сделайте и так, и так. И сразу увидите разницу.

А так-то есть любители микросекундных прерываний, которые жалуются на "медленность" F4 процессора.

Share this post


Link to post
Share on other sites

haker_fox

Дополнительно рекомендую автору топика изучить возможность использования пакетной передачи (burst), которая позволяет сократить количество служебных операций на шине, и тоже ускорить передачу, заставляя меньше простаивать других мастеров (тот же процессор) на шине.

Share this post


Link to post
Share on other sites

jenya7
27 minutes ago, haker_fox said:

Дополнительно рекомендую автору топика изучить возможность использования пакетной передачи (burst), которая позволяет сократить количество служебных операций на шине, и тоже ускорить передачу, заставляя меньше простаивать других мастеров (тот же процессор) на шине.

У NXP (Kinetis) я такого не нашел. У них есть TCD queue - TDC0-TDCn но я туда не лезу, мне бы просто послать для начала.

Edited by jenya7

Share this post


Link to post
Share on other sites

V_G
3 часа назад, jenya7 сказал:

Какая разница и что предпочтительней?

Повторю многих: зависит от окружения и от задачи. Если DMA используется только парой устройств (передатчиком и приемником), гоните сразу 4096 байт. Если много кому требуется DMA, изучайте пакеты, приоритеты, арбитражи и все это...

Share this post


Link to post
Share on other sites

jenya7
20 minutes ago, V_G said:

Повторю многих: зависит от окружения и от задачи. Если DMA используется только парой устройств (передатчиком и приемником), гоните сразу 4096 байт. Если много кому требуется DMA, изучайте пакеты, приоритеты, арбитражи и все это...

тогда

Quote

гоните сразу 4096 байт

у меня довольно простая задача - в цикле вычитать х страниц из памяти (SPI) и послать по UART. В псевдокоде выглядит так

while (pages)
{
    SPI_GetPage(pages, &buff);
    
    UART_SendDMA(buff);
    
    pages--;
}

Пока UART посылает buff я вычитываю следующую страницу.

ё. получается в тот же буфер я пишу и одновременно посылаю. нужно делать double buffering?

Edited by jenya7

Share this post


Link to post
Share on other sites

my504
34 minutes ago, jenya7 said:

нужно делать double buffering?

Скорость УАРТа несоразмерна скорости SPI. Поэтому событие опустошения буфера УАРТа может быть реквестом запуска передачи по SPI, а событие приема по SPI генерирует реквест для передачи по УАРТу. Кольцо будет работать автоматически и без буфера до тех пор, пока счетчик ДМА в SPI передатчике не завершит процесс.

Share this post


Link to post
Share on other sites

jenya7
1 hour ago, my504 said:

Скорость УАРТа несоразмерна скорости SPI. Поэтому событие опустошения буфера УАРТа может быть реквестом запуска передачи по SPI, а событие приема по SPI генерирует реквест для передачи по УАРТу. Кольцо будет работать автоматически и без буфера до тех пор, пока счетчик ДМА в SPI передатчике не завершит процесс.

у меня вычитка по SPI без DMA. в любом случае тут нет пинг-понга. пока UART передаёт я уже на строке SPI_GetPage(pages, &buff); и должен тянуть следующую порцию.

Edited by jenya7

Share this post


Link to post
Share on other sites

jcxz
4 часа назад, jenya7 сказал:

А можно послать 1 байт 4096 раз

Какая разница и что предпочтительней?

После таких глупых вопросов, возникает только один вопрос - для чего вам DMA?

Понимаете, что оно такое и для чего нужно?

Share this post


Link to post
Share on other sites

jenya7
5 minutes ago, jcxz said:

После таких глупых вопросов, возникает только один вопрос - для чего вам DMA?

Понимаете, что оно такое и для чего нужно?

я бы понял если бы вы разъяснили. но у вас задачи другие.

Edited by jenya7

Share this post


Link to post
Share on other sites

jcxz
5 минут назад, jenya7 сказал:

я бы понял если бы вы разъяснили. но у вас задачи другие.

А какой смысл? Ведь 100500 раз уже объяснялось. Да и написано на каждом заборе в каждом описании DMA. Результат как видно =0.

Да и в своём посте я как раз разъяснил. Но вы опять не поняли....  :unknw:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.