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

Обмен в Zynq данными в режиме AMP через DDR.

Подскажите как организовать обмен данными между CPU0 и CPU1 с использованием DMA через DDR.

 

Освоил обмен через OCM как в xapp1078, но он, видимо, годен для обмена небольшими блоками данных. Хотелось бы обмениваться большими блокми и через DMA. На одном отдельном процессоре, например, CPU1 всё работает, и данные пересылаются и прерывания приходят. Но если пересылку делать из области памяти одного процессора в другой, то ни прерывания ни данных на процессоре-приёмнике не вижу, хотя первый отправляет и даже ловит прерывание об окончании отправки.

 

Память размечена:

CPU0 base 0x00100000 size 0x0x10000000

CPU1 base 0x30000000 size 0x0x10000000

 

Версия ПО Vivado 2015.1

 

Файл standalone/boot.S - для CPU1 модифицирован как в xapp1078.

 

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


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

Не забываем про синхронизацию кэша для ддр - на передающем нужно скинуть кэш, а на приемном обновить

смотрите функции в xil_cache.h

процедура не быстрая - может занимать 10-ки мкс

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


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

После того как расшарил общую память 0x10000000:

Xil_SetTlbAttributes(0x10000000, 0xC06); - ещё не разобрался, что это точно значит

Вижу из обоих процессоров, что память скопировалась.

 

Однако прерывание по-прежнему доходит только до передающего, даже если назначить цель прерывания ICDIPTR только на приемный проц.

 

И ещё заметил, что после отправки пакета XDmaPs_Start, в передатчике канал виден как активный, а в приемнике нет.

 

while (1) {

active = XDmaPs_IsActive(DmaInst, 0); // CPU1 active = 1, CPU0 active = 0;

};

 

На счёт кэша в голове каша. В какой момент надо что сделать не совсем понял? после отправки (XDmaPs_Start) вызвать Xil_L1DCacheInvalidate или до? И в какой момент на приёме вызывать Xil_L1DCacheFlush, при получении прерывания или оно не придет пока не вызвать flush?

 

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


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

На счёт кэша в голове каша. В какой момент надо что сделать не совсем понял? после отправки (XDmaPs_Start) вызвать Xil_L1DCacheInvalidate или до? И в какой момент на приёме вызывать Xil_L1DCacheFlush, при получении прерывания или оно не придет пока не вызвать flush?

1. Выделить участок памяти ддр для обмена - для надежности что бы не попадал в выделенные области для обоих цпу

2. На мастере положить данные в этот участок

3. Вызвать Xil_DCacheFlush для всей или Xil_DCacheFlushRange для участка

4. Дать прерывание слэйву

5. По прерыванию на слэйве вызвать Xil_DCacheInvalidate для всей или Xil_DCacheInvalidateRange для оговоренного участка

6. Использовать данные из ддр на слэйве

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

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


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

Ок, с этим кажись разобрался, буду пробовать. Прерывание, видимо, SGI будет.

Но почему не получилось наладить обмен через ДМА так и не понял.

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


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

Но почему не получилось наладить обмен через ДМА так и не понял.

а зачем тут дма, если ддр видна в полном объеме с обоих цпу, если только копию данных делать, но для "больших" данных это накладно по времени, да и двойной-тройной буфер для обмена сделать не проблема - пока слэйв обрабатывает один буфер - заполняем второй и т.д.

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


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

Да, всё так, изначально хотел делать с одним буфером, но примеров не нашёл понятных. А дма теперь чисто из интереса, чтобы разобраться.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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