О бедном WIZnet’e замолвите слово


В процессе разработки одного из проектов у нас возникла задача передать поток данных 2Mbit/s через Ethernet в виде udp-потока. Так как сроки были ограничены, развести плату «под задачу» с нормальным ethernet-контроллером, оказалось невозможным. В результате, за основу была взята уже имеющаяся карта от прибора Беркут-ММТ c установленным на борту контроллером WIZnet W5100. Этот контроллер уже применялся в других проектах и ничто не предвещало беды…

Тут следует рассмотреть, что же из себя представляет контроллер WIZnet W5100. В далёкие времена, когда контроллеры были 8-битными, памяти было мало, а реализация TCP/IP требовалась, появились микросхемы реализующие аппаратно стек TCP/IP. Вроде бы хорошая вещь и, например, для дистанционного управления устройством вполне подходит, позволяя не задумываться о тонкостях протокола TCP/IP, но у всего есть свои ограничения. О том нужны ли такие контроллеры сейчас, при наличии свободно распространяемых IP-стеков для микроконтроллеров и больших объёмах памяти — вопрос спорный и, возможно, заслуживающий отдельной статьи.

И тут мы подходим к тому, что же у нас пошло не так. W5100 можно подключить по трём возможным интерфейсам: двум разновидностям параллельного и по SPI. В нашем случае, для экономии выводов контроллера и упрощения подключения, wiznet подключили по SPI. О производительности в тот момент просто не задумывались, так как сразу использовать его планировалось только для дистанционного управления.

Когда же возникла потребность прогнать через wiznet 2Мбит/с данных, этот вопрос встал в полный рост. И тут в дело вступили ограничения чипа. Как оказалось, максимальная тактовая частота по SPI для wiznet была ограничена 14-ю мегагерцами. Это не было бы проблемой, если бы wiznet поддерживал burst режим и позволял гнать данные непрерывным потоком. Но тут в дело вступило ещё одно ограничение интерфейса SPI у wiznet’а — каждая SPI транзакция у него должна состоять ровно из 4-х байт и содержать код операции, два байта адреса и один байт данных. То есть, на каждый байт полезной нагрузки требовалось передавать 3 байта дополнительных данных. И это — не считая управляющих транзакций, которые передаются по той же схеме. Максимальная пропускная способность, которую мы считали равной 14Мбит/с, оказалась в 4 (!!!) раза меньше и оказалась 3.5Мбит/с.

Второй проблемой оказался SPI-контроллер в процессоре STM32 — делители частоты в нём могут быть только степенью 2. В результате на максимальной тактовой частоте процессора, которую мы использовали до того времени, частота шины к wiznet’у оказалась только 9 мегагерц.

Помимо проблемы передачи данных к wiznet’у так же требовалось эти данные получить из контроллера линии E1. К счастью, решение, использованное для чтения данных из E1, поддерживало burst-режим передачи данных. Попытки получить максимальную возможную скорость передачи к wiznet’у привели к использованию следующей схемы передачи данных:

  1. Из E1 данные вытягиваются по SPI с помощью контроллера DMA, встроенного в процессор STM32. Так как посылки имеют большую длину, DMA работает с высокой эффективностью и накладные расходы невелики.
  2. Данные в wiznet передаются без использования DMA или прерываний, так как это резко снижает производительность на коротких посылках в связи с высокими накладными расходами.
  3. Для получения возможности одновременной передачи данных в wiznet и приёма данных с линии E1 введена двойная буферизация.
  4. Основное ограничение по времени — это передача данных в wiznet, в связи с тем, что приём данных из E1 практически не требует процессорного времени.

В результате всех этих исследования мы пришли к следующим выводам:

  1. Иногда целесообразном снизить тактовую частоту процессора с целью повышения производительности передачи данных по внешним интерфейсам.
  2. DMA у контроллера STM32 эффективно можно использовать только при достаточно длинных транзакциях. Для случая коротких (4 байта ) транзакций потери в скорости слишком велики.

В итоге мы смогли получить требуемые 2Мбит/с с небольшим резервом, используемым для целей удалённого управления, а так же как «запас прочности».

3 комментария

  1. Jury093:

    корейцы не порадовали, впрочем они о производительности честно пишут в своем местном факе :)
    отсюда:
    http://www.wiznet.co.kr/Sub_Modules/en/technical/FAQ_View.asp?boardcd=102&PK_NUM=15078&page=1&SF_Part=&SF_KeyWord=
    типа, бла-бла-бла — — Testing MCU : Atmega 128L-8AU External 8Mhz Crystal и линк на пдф..
    т.е. SPI master максимально 4МГц (если не ошибаюсь)

    Protocol TCP Server TCP Client UDP
    SPI 0.3 Mbps 0.3 Mbps 0.29 Mbps

    • Антон Фельдман:

      это, всё же, производительность атмеги. потому как у нас получилось где-то 2.1Mbps. а spi у wiznet’а — max 14МГц.

      а pdf недоступен на их сайте.

  2. Антон Фельдман:

    а комментарии режутся из-за ссылки на радикал. «паразит илиминатор», однако, иногда срабатывает.