реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Обмен в Zynq данными в режиме AMP через DDR.
elzaro
сообщение Jul 6 2015, 10:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 26-11-10
Пользователь №: 61 201



Подскажите как организовать обмен данными между 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.
Go to the top of the page
 
+Quote Post
fguy
сообщение Jul 6 2015, 13:26
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 27-11-08
Пользователь №: 42 009



Не забываем про синхронизацию кэша для ддр - на передающем нужно скинуть кэш, а на приемном обновить
смотрите функции в xil_cache.h
процедура не быстрая - может занимать 10-ки мкс
Go to the top of the page
 
+Quote Post
elzaro
сообщение Jul 6 2015, 14:16
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 26-11-10
Пользователь №: 61 201



После того как расшарил общую память 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?
Go to the top of the page
 
+Quote Post
fguy
сообщение Jul 6 2015, 14:55
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 27-11-08
Пользователь №: 42 009



Цитата(elzaro @ Jul 6 2015, 17:16) *
На счёт кэша в голове каша. В какой момент надо что сделать не совсем понял? после отправки (XDmaPs_Start) вызвать Xil_L1DCacheInvalidate или до? И в какой момент на приёме вызывать Xil_L1DCacheFlush, при получении прерывания или оно не придет пока не вызвать flush?

1. Выделить участок памяти ддр для обмена - для надежности что бы не попадал в выделенные области для обоих цпу
2. На мастере положить данные в этот участок
3. Вызвать Xil_DCacheFlush для всей или Xil_DCacheFlushRange для участка
4. Дать прерывание слэйву
5. По прерыванию на слэйве вызвать Xil_DCacheInvalidate для всей или Xil_DCacheInvalidateRange для оговоренного участка
6. Использовать данные из ддр на слэйве

Сообщение отредактировал fguy - Jul 6 2015, 14:57
Go to the top of the page
 
+Quote Post
elzaro
сообщение Jul 6 2015, 17:57
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 26-11-10
Пользователь №: 61 201



Ок, с этим кажись разобрался, буду пробовать. Прерывание, видимо, SGI будет.
Но почему не получилось наладить обмен через ДМА так и не понял.
Go to the top of the page
 
+Quote Post
fguy
сообщение Jul 7 2015, 06:47
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 27-11-08
Пользователь №: 42 009



Цитата(elzaro @ Jul 6 2015, 20:57) *
Но почему не получилось наладить обмен через ДМА так и не понял.

а зачем тут дма, если ддр видна в полном объеме с обоих цпу, если только копию данных делать, но для "больших" данных это накладно по времени, да и двойной-тройной буфер для обмена сделать не проблема - пока слэйв обрабатывает один буфер - заполняем второй и т.д.
Go to the top of the page
 
+Quote Post
elzaro
сообщение Jul 7 2015, 09:22
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 26-11-10
Пользователь №: 61 201



Да, всё так, изначально хотел делать с одним буфером, но примеров не нашёл понятных. А дма теперь чисто из интереса, чтобы разобраться.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 07:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016