Jump to content
    

SG-DMA в режиме Stream To Memoy

Прерывания по количеству выполненых дескрипторов:

 

(ALTERA_AVALON_SGDMA_CONTROL_IE_MAX_DESC_PROCESSED_MSK | (8<<ALTERA_AVALON_SGDMA_CONTROL_MAX_DESC_PROCESSED_OFST) )

 

т.к. строится зацикленная цепочка дескрипторов и бит PARK установлен, т.е. OWNED_BY_HW не чистится...

 

Не понял, зачем вам по количеству? Вам же все равно после цепочки вызывать прерывания, так вызовите там do_async_transfer за одно. Циклить то зачем, вызывайте то один то другой.

Share this post


Link to post
Share on other sites

Мне хотелось по минимуму задействовать процессор, т.к. большой (относительно моей системы) поток данных.

Если иметь прерывание в конце цепочки, то нужно иметь пустой (незадействованный) дескриптор в конце.

Для 2-х цепочек, соответственно 2 пустых дескриптора.

Плюс перезапуск SG-DMA. А так получается замечательно:

1) Цепочка зациклена, перезапуск не требуется

2) Прерывания, в которых только 2 флага (буфер заполнен и верхний/нижний буфер) дёрнуть - минимум операций.

 

На текущий момент:

1) Зациклить дескрипторы получилось

2) Прерывания по числу дескрипторов приходят не в своё время,

работаю по прерыванию обработки одного дескриптора + подсчёт прерываний.

Edited by Копейкин

Share this post


Link to post
Share on other sites

Посмотрел внимательно на Альтере:

ссылка

там английским языком сказано:

Title

Why do I only see one interrupt on the Scatter Gather DMA when enabling the MAX_DESC_PROCESSED interrupt?

 

Description

 

If you are using the MAX_DESC_PROCESSED interrupt from the Scatter Gather DMA you must update the MAX_DESC_PROCESSED field at each interrupt to a new value. The core implements an 8 bit counter which automatically wraps to zero when the count value equals 255.

 

For example, if you wanted the core to generate an interrupt after 2 descriptors were processed continually, you would initially set the MAX_DESC_PROCESSED field to 2 and then upon receiving the first interrupt you would update the MAX_DESC_PROCESSED field to 4, upon receiving the next interrupt update the field to 6 and so on.

Получается нужно обновлять состояние регистра управления на каждом прерывании.

Без вмешательства процессора не обойтись.

А жаль...

Share this post


Link to post
Share on other sites

Получается нужно обновлять состояние регистра управления на каждом прерывании.

Без вмешательства процессора не обойтись.

А жаль...

Ну да, похоже две цепочки как я говорил проще будут.

Share this post


Link to post
Share on other sites

Я сейчас, как и описывал, сделал бесконечный цикл по дескрипторам и дескрипторы больше не трогаю.

Прерывание - по обработке одного дескриптора.

В обработчике прерывания считаю количество и устанавливаю флаги.

Мне так проще показалось.

Share this post


Link to post
Share on other sites

Добрый день! Хочу запустить SGDMA в режиме mem to srteam. Работаю с отладочной платой DE0 от терасик в Quartus II v.11.1, использую Nios II /e. Было решено запустить альтеровский пример с SGDMA и SSRAM( SSRAM(MM) --> (MM)SGDMA(ST) --> (ST)SGDMA(MM) --> SSRAM(MM)) . Я вместо SSRAM использую SDRAM. Пример запускается, прохожу все шаги до while(tx_done == 0) успешно, но здесь все и заканчивается. То есть я не захожу на свой callback function, где меняю значение tx_done. Почему? ДМА не запускается? или м.б. ошибки при сборки в Qsys? Не могу разобраться. Скриншоты и файлы программы прилагаю.

SGDMA.rar

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.

×
×
  • Create New...