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

Посылка по DMA

Можно послать 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);

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

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

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


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

38 minutes ago, Gorby said:

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

 

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

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

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

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


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

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

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

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

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


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

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

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


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

27 minutes ago, haker_fox said:

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

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

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

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


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

а прерывание нужно включать или можно проверять окончание полингом флага DONE?

(DMA0->TCD[1].CSR & DMA_CSR_DONE_MASK)

 


 

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

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


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

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

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

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

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


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

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?

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

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


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

34 minutes ago, jenya7 said:

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

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

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


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

1 hour ago, my504 said:

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

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

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

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


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

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

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

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

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

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

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


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

5 minutes ago, jcxz said:

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

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

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

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

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


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

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

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

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

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

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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