Jump to content
    

Обмен в 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.

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

После того как расшарил общую память 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?

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Edited by fguy

Share this post


Link to post
Share on other sites

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

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

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

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...