elzaro 0 6 июля, 2015 Опубликовано 6 июля, 2015 · Жалоба Подскажите как организовать обмен данными между 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fguy 5 6 июля, 2015 Опубликовано 6 июля, 2015 · Жалоба Не забываем про синхронизацию кэша для ддр - на передающем нужно скинуть кэш, а на приемном обновить смотрите функции в xil_cache.h процедура не быстрая - может занимать 10-ки мкс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
elzaro 0 6 июля, 2015 Опубликовано 6 июля, 2015 · Жалоба После того как расшарил общую память 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fguy 5 6 июля, 2015 Опубликовано 6 июля, 2015 (изменено) · Жалоба На счёт кэша в голове каша. В какой момент надо что сделать не совсем понял? после отправки (XDmaPs_Start) вызвать Xil_L1DCacheInvalidate или до? И в какой момент на приёме вызывать Xil_L1DCacheFlush, при получении прерывания или оно не придет пока не вызвать flush? 1. Выделить участок памяти ддр для обмена - для надежности что бы не попадал в выделенные области для обоих цпу 2. На мастере положить данные в этот участок 3. Вызвать Xil_DCacheFlush для всей или Xil_DCacheFlushRange для участка 4. Дать прерывание слэйву 5. По прерыванию на слэйве вызвать Xil_DCacheInvalidate для всей или Xil_DCacheInvalidateRange для оговоренного участка 6. Использовать данные из ддр на слэйве Изменено 6 июля, 2015 пользователем fguy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
elzaro 0 6 июля, 2015 Опубликовано 6 июля, 2015 · Жалоба Ок, с этим кажись разобрался, буду пробовать. Прерывание, видимо, SGI будет. Но почему не получилось наладить обмен через ДМА так и не понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fguy 5 7 июля, 2015 Опубликовано 7 июля, 2015 · Жалоба Но почему не получилось наладить обмен через ДМА так и не понял. а зачем тут дма, если ддр видна в полном объеме с обоих цпу, если только копию данных делать, но для "больших" данных это накладно по времени, да и двойной-тройной буфер для обмена сделать не проблема - пока слэйв обрабатывает один буфер - заполняем второй и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
elzaro 0 7 июля, 2015 Опубликовано 7 июля, 2015 · Жалоба Да, всё так, изначально хотел делать с одним буфером, но примеров не нашёл понятных. А дма теперь чисто из интереса, чтобы разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться