Цитата(Golikov A. @ Jan 12 2015, 17:50)

Вообще изначально LwIP у ксалинкса с большим числом перекопирований сделан, при работе с ДДР - это тоже здорово тормозить обмен, так как его буферы обычно в нем и лежат... Попробуйте кеши процу увеличить и добавить кеш обращений в кеш.
Так и есть, сейчас UDP пакет заполняю данными из DDR, использую DDR как буфер.
У меня двупортовая BRAM - 512KByte, со стороны железа в один порт закидываю кадр, когда она полна, дергаю за ногу внешнего прерывания процессор. А через второй порт в процессоре, по флагу прерывания копирую кадр из BRAM, в DDR, с помощью memcpy(), а из DDR, по строкам передаю UDP пакетами.
Если просто в бесконечном цикле, один и тот же кадр отсылаю из DRR
Код
transfer_utxperf_data()
{
...
for (zz = 0; zz < N_packets; zz++) // читаю кадр из DDR
{
memcpy(pbuf_to_be_sent->payload, pData_DDR + (zz*1040),1040);
err = udp_send(pcb, pbuf_to_be_sent);
}
}
То сниффер показывает скорость 350 Mbit в сек.
(Без ожидания прерывания и копирования кадра из BRAM в DDR)
Если в бесконечном цикле, без ожидания прерывания, но с копированием кадра 648*486 из BRAM в DDR, то скорость 250 Mbit в сек.
Копирование делаю, чтобы исключить одновременное чтение и запись в BRAM со стороны железа и процессора.
Код
main.c
...
while (1)
{
if (is_ext_interrupt == 1) // Флаг внешнего прерывания
{
is_ext_interrupt = 0;
memcpy(pData_DDR, pData_1, frame_size);
xemacif_input(netif); // без неё нет отправки
transfer_utxperf_data(); // отправка UDP пакета
}
}
Пример отправки UDP пакетов взял из echo - сервера.
Не могу понять необходимость вызова функции чтения входного порта перед отправкой UDP пакета: xemacif_input(netif);
Без неё пакеты не отправляются.