Evgeny_CDАрхитектор (26.01.2012 12:16, просмотров: 5053)
Пусть мне надо передать данные через PCI|PCIe с минимальной тратой процессорного времени хоста и латентностью. Правильно ли делать так? Есть 5 пространств в области памяти:
• TX дескрипторы
• TX данные
• RX дескрипторы
• RX данные
• Уведомления target. Эта часть находится в блочной памяти FPGA и видна как несколько регистров host и target
Target в режиме bus master пишет в область данных, пишет в область дескрипторов, и дергает за INT.
Host получает прерывание, читает дескрипторы, читает данные и обрабатывает. Потом из области уведомлений он читает указатели на свободный блок данных, свободный дескриптор (номер дескриптора в массиве), и указатель на свободное место под команду – одиночное чтение U32, можно в битовом массиве упаковать нужное число битов для номеров всех дескрипторов. Далее он пишет данные в область данных, пишет дескриптор, и пишет U32 в область уведомления по номеру свободного дескриптора. В этом U32 команда и указатель на номер последнего записанного дескриптора.
Taget читает команду, и bus master читает данные из области данных и дескрипторов.
Если область уведомлений обрабатывать автоматом на блоке памяти FPGA, то латентность процессоров может быть довольно большой. Летят пакеты в обе стороны, главное, чтобы буфера в памяти не переполнились.
Ну а поскольку target у нас умный, то все его пакеты имеют штамп реального времени – чтобы хост потом мог разобраться – что когда случилось.
Что-нибудь более продвинутое придумать можно?