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