jenya7 0 Posted December 12, 2021 (edited) · Report post Можно послать 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 December 12, 2021 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Gorby 0 Posted December 12, 2021 · Report post Оптом - дешевле. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jenya7 0 Posted December 12, 2021 (edited) · Report post 38 minutes ago, Gorby said: Оптом - дешевле. оптом это первый или второй вариант? как по мне оба варианта оптом, если флаг DONE выставляется по окончании (minor * major). Edited December 12, 2021 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Gorby 0 Posted December 12, 2021 · Report post // Number of bytes to be transfered in each service request of the channel Абстрактно думается, что у каждого service request есть накладные расходы (в том числе неявные, неочевидные для программиста). Точный ответ может дать только точное знание хардверной схемы. Учитывая внутренние шины со своими заморочками, можно (волюнтаристически) предположить, что один большой блок передавать экономнее. А на пальцах, в конкретной ситуации просто сделайте и так, и так. И сразу увидите разницу. А так-то есть любители микросекундных прерываний, которые жалуются на "медленность" F4 процессора. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
haker_fox 0 Posted December 12, 2021 · Report post Дополнительно рекомендую автору топика изучить возможность использования пакетной передачи (burst), которая позволяет сократить количество служебных операций на шине, и тоже ускорить передачу, заставляя меньше простаивать других мастеров (тот же процессор) на шине. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jenya7 0 Posted December 12, 2021 (edited) · Report post 27 minutes ago, haker_fox said: Дополнительно рекомендую автору топика изучить возможность использования пакетной передачи (burst), которая позволяет сократить количество служебных операций на шине, и тоже ускорить передачу, заставляя меньше простаивать других мастеров (тот же процессор) на шине. У NXP (Kinetis) я такого не нашел. У них есть TCD queue - TDC0-TDCn но я туда не лезу, мне бы просто послать для начала. Edited December 12, 2021 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jenya7 0 Posted December 12, 2021 (edited) · Report post а прерывание нужно включать или можно проверять окончание полингом флага DONE? (DMA0->TCD[1].CSR & DMA_CSR_DONE_MASK) Edited December 12, 2021 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
V_G 0 Posted December 12, 2021 · Report post 3 часа назад, jenya7 сказал: Какая разница и что предпочтительней? Повторю многих: зависит от окружения и от задачи. Если DMA используется только парой устройств (передатчиком и приемником), гоните сразу 4096 байт. Если много кому требуется DMA, изучайте пакеты, приоритеты, арбитражи и все это... Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jenya7 0 Posted December 12, 2021 (edited) · Report post 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 December 12, 2021 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
my504 0 Posted December 12, 2021 · Report post 34 minutes ago, jenya7 said: нужно делать double buffering? Скорость УАРТа несоразмерна скорости SPI. Поэтому событие опустошения буфера УАРТа может быть реквестом запуска передачи по SPI, а событие приема по SPI генерирует реквест для передачи по УАРТу. Кольцо будет работать автоматически и без буфера до тех пор, пока счетчик ДМА в SPI передатчике не завершит процесс. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jenya7 0 Posted December 12, 2021 (edited) · Report post 1 hour ago, my504 said: Скорость УАРТа несоразмерна скорости SPI. Поэтому событие опустошения буфера УАРТа может быть реквестом запуска передачи по SPI, а событие приема по SPI генерирует реквест для передачи по УАРТу. Кольцо будет работать автоматически и без буфера до тех пор, пока счетчик ДМА в SPI передатчике не завершит процесс. у меня вычитка по SPI без DMA. в любом случае тут нет пинг-понга. пока UART передаёт я уже на строке SPI_GetPage(pages, &buff); и должен тянуть следующую порцию. Edited December 12, 2021 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jcxz 4 Posted December 12, 2021 · Report post 4 часа назад, jenya7 сказал: А можно послать 1 байт 4096 раз Какая разница и что предпочтительней? После таких глупых вопросов, возникает только один вопрос - для чего вам DMA? Понимаете, что оно такое и для чего нужно? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jenya7 0 Posted December 12, 2021 (edited) · Report post 5 minutes ago, jcxz said: После таких глупых вопросов, возникает только один вопрос - для чего вам DMA? Понимаете, что оно такое и для чего нужно? я бы понял если бы вы разъяснили. но у вас задачи другие. Edited December 12, 2021 by jenya7 Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
jcxz 4 Posted December 12, 2021 · Report post 5 минут назад, jenya7 сказал: я бы понял если бы вы разъяснили. но у вас задачи другие. А какой смысл? Ведь 100500 раз уже объяснялось. Да и написано на каждом заборе в каждом описании DMA. Результат как видно =0. Да и в своём посте я как раз разъяснил. Но вы опять не поняли.... Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...