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