Подскажите как организовать обмен данными между 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?
Цитата(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. Использовать данные из ддр на слэйве
Ок, с этим кажись разобрался, буду пробовать. Прерывание, видимо, SGI будет.
Но почему не получилось наладить обмен через ДМА так и не понял.
Цитата(elzaro @ Jul 6 2015, 20:57)

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