Модификация Ethernet Shield на W5100
- Войдите на сайт для отправки комментариев
Пнд, 29/01/2018 - 04:40
Всем привет!
Есть Arduino Due и Ethernet Shield.
По проекту требуется принимать большое количество UDP пакетов за раз(8 по 572 байта). Причем их поток может достигать 200-300 пакетов в секунду. Вроде как проблемы со скоростью разбора пакетов нет. Порции пакетов разбираются, но обычно в среднем доходит только 4-5 из порции.(причем обычно стабильно доходят первые 3, а остальные как пойдет) Как я понимаю все дело в максимальном размере буфера на сокет(2кб). Шилд поддерживает 4 сокета. Можно ли увеличить буфер за счет этих сокетов(путем правки библиотеки) чтобы исправить ситуацию? Или дело не в буфере? И как вообще организованы эти 16кб памяти?
Заранее спасибо за помощь!
Всем привет!
Есть Arduino Due и Ethernet Shield.
По проекту требуется принимать большое количество UDP пакетов за раз(8 по 572 байта). Причем их поток может достигать 200-300 пакетов в секунду. Вроде как проблемы со скоростью разбора пакетов нет. Порции пакетов разбираются, но обычно в среднем доходит только 4-5 из порции.(причем обычно стабильно доходят первые 3, а остальные как пойдет)
Похоже, что дело именно в скорости разбора пакетов, иначе бы всегда стабильно доходило только 3 пакета, все остальные бы реджектились (4*572 = 2288, что больше, чем 2кб). А для UDP реджект равносилен потере.
К тому же о каких пакетах идет речь - о ваших, протокольных или MTU вашей сети равно 572 байта?
Как я понимаю все дело в максимальном размере буфера на сокет(2кб). Шилд поддерживает 4 сокета. Можно ли увеличить буфер за счет этих сокетов(путем правки библиотеки) чтобы исправить ситуацию?
8кб на TX в целом, 8кб на RX в целом, внутри делятся по кол-ву сокетов.
Всем привет!
Есть Arduino Due и Ethernet Shield.
По проекту требуется принимать большое количество UDP пакетов за раз(8 по 572 байта). Причем их поток может достигать 200-300 пакетов в секунду. Вроде как проблемы со скоростью разбора пакетов нет. Порции пакетов разбираются, но обычно в среднем доходит только 4-5 из порции.(причем обычно стабильно доходят первые 3, а остальные как пойдет)
Похоже, что дело именно в скорости разбора пакетов, иначе бы всегда стабильно доходило только 3 пакета, все остальные бы реджектились (4*572 = 2288, что больше, чем 2кб). А для UDP реджект равносилен потере.
Пакеты Artnet(DMX). Все это дело должно рулить лентой через DMA.
Мои тесты привели к тому, что Due тратит в среднем по 7мс на прростой парс пакета(перенос в буфер на плате + извлечение пары параметров).
Почему так много? Дело в SPI? Известно, что stm32f107 справляется с пачкой в 16 пакетов при 25 фпс.
Если к этому всему добавить перенос в память библиотеки и обновление данных(через DMA) на 8 лентах, то время доходит до 12мс.
Как я понимаю все дело в максимальном размере буфера на сокет(2кб). Шилд поддерживает 4 сокета. Можно ли увеличить буфер за счет этих сокетов(путем правки библиотеки) чтобы исправить ситуацию?
Пакеты Artnet(DMX). Все это дело должно рулить лентой через DMA.
...
Если к этому всему добавить перенос в память библиотеки и обновление данных(через DMA) на 8 лентах, то время доходит до 12мс.
В STM я нибэнимэ.
Как нужно изменить это значение, чтобы получить допустим 10кб на прием/5кб отдача (нужна только чтобы отвечать на запросы главного узла). И это на 2 сокета. Не вижу смысла использовать больше, так как соедниенение через unicast (броадкаст еще больше будет забивать буффер)?
10кб - никак. Манипуляция в пределах 8кб: 2 кб на сокет, 2*4 кб + 2*0кб, 1*8кб+3*0кб и пр.
https://www.sparkfun.com/datasheets/DevTools/Arduino/W5100_Datasheet_v1_... PG.23
Для Wiznet W5500 можно взять 16кб на сокет:
Sn_RXBUF_SIZE configures the RX buffer block size of Socket n. Socket n RX Buffer Block size can be configured with 1,2,4,8, and 16 Kbytes. If a different size is configured, the data cannot be normally received from a peer. Although Socket n RX Buffer Block size is initially configured to 2Kbytes, user can re-configure its size using Sn_RXBUF_SIZE. The total sum of Sn_RXBUF_SIZE cannot be exceed 16Kbytes. When exceeded, the data reception error is occurred.
Как нужно изменить это значение, чтобы получить допустим 10кб на прием/5кб отдача (нужна только чтобы отвечать на запросы главного узла). И это на 2 сокета. Не вижу смысла использовать больше, так как соедниенение через unicast (броадкаст еще больше будет забивать буффер)?
10кб - никак. Манипуляция в пределах 8кб: 2 кб на сокет, 2*4 кб + 2*0кб, 1*8кб+3*0кб и пр.
https://www.sparkfun.com/datasheets/DevTools/Arduino/W5100_Datasheet_v1_1_6.pdf PG.23
Как правильно нужно производить эту конфигурацию. В файле W5100.cpp изменил значения на 0xAA, там же TX_RX_MAX_BUF_SIZE на 4096
В W5100.h SOKETS с 4х на 2, MAX_SOCK_NUM на 2
Принимает несколько пакетов и прекращает.
Как правильно нужно производить эту конфигурацию. В файле W5100.cpp изменил значения на 0xAA, там же TX_RX_MAX_BUF_SIZE на 4096
...
В W5100.h SOKETS с 4х на 2, MAX_SOCK_NUM на 2
...
Принимает несколько пакетов и прекращает.
Я бы тоже с этого начал. На самом деле там, в либе, может быть еще какой-нить хардкод спрятан.
И я, бы, пожалуй, взял дрова с Wiznet-овского гитхаба. Всё же ближе к производителю. Может пофикшено что-нить.
Ещё добавлю, что реализация штатной библиотеки Ethernet - не айс, посмотрите в исходниках на EthernetServer::available - там проблема с выбором сокета давнишняя (может, щас уже пофиксили, хз). Если вкратце - то при интенсивных коннектах клиентами выбирается клиент с наименьшим номером сокета, а тот, который хоть и пришёл раньше, но имеет бОльший номер - курит бамбук, пока не обработаются челики с головы состава.
Это одна из причин, по которой в своё время отказался от Ethernet в проектах. Вторая причина - ESP ;)
Хорошо, попробую переписать под оригинальную библиотеку. Возможно это решит проблему со скоростью обработки пакета.
Нашел время, поэкспериментировал с W5100. До 8кб сокет тянется, но в библиотеке есть хардкод на 4 сокета по 2Kb. Вроде как я его весь обнаружил, на TCP работает, на UDP не проверял.
Так что если еще актуально - пишите, расскажу.
Нашел время, поэкспериментировал с W5100. До 8кб сокет тянется, но в библиотеке есть хардкод на 4 сокета по 2Kb. Вроде как я его весь обнаружил, на TCP работает, на UDP не проверял.
Так что если еще актуально - пишите, расскажу.
Хорошая новость! Актуально! Еще бы на UDP заработало:))
У меня свой форк библиотеки, который я вычищаю сейчас (в стоковой куча всякой странной ерунды болтается) и в котором делаю автомат. вычисления адресов/значений регистров, поэтому опишу в целом.
w5100.cpp:
То, что закомментировано - было в изначальном варианте, незакомментировано - мои исправления
Проверял так
1) С линукса в сокет писал любой мусор пачкой соотв. размера, на стороне ардуины client.available() выводил в сериал монитор.
2) На стороне linux писал строку в сокет / ждал ответа от ардуины.
Оба варианта при тестировании проблем не показали.
У меня свой форк библиотеки, который я вычищаю сейчас (в стоковой куча всякой странной ерунды болтается) и в котором делаю автомат. вычисления адресов/значений регистров, поэтому опишу в целом.
w5100.cpp:
То, что закомментировано - было в изначальном варианте, незакомментировано - мои исправления
Проверял так
1) С линукса в сокет писал любой мусор пачкой соотв. размера, на стороне ардуины client.available() выводил в сериал монитор.
2) На стороне linux писал строку в сокет / ждал ответа от ардуины.
Оба варианта при тестировании проблем не показали.
Понял, как будет доступ к плате протестирую. Спасибо, надеюсь поможет)
Приветствую!
Опробовал ваш вариант библиотеки. Все работает. Удается ловить и парсить по +-145 пакетов в секунду. Выходит по 6-7мс на 1 пакет(Udp.parse()+пара if на проверку принадлежности к Артнет). Как я понимаю скорость обработки уже упирается в саму шилду. Возможно ли будет дополнительно как-то повысить скорость обработки пакетов?
Я нашел такой документ: https://github.com/manitou48/DUEZoo/blob/master/wizperf.txt
Не знаю, насколько он правдив, на него ссылаются тут: https://forum.arduino.cc/index.php?topic=138228.0
В нем написано, что "wiznet claims only 0.3mbs for W5100, 33.3mbs for W5200" , так же там есть какие-то цифры, но я так и не понял по какой методике это считалось.
У вас же поток, если я правильно понимаю, 145*572=82,940 килобайта/сек, что составляет ~0.65mbs, что явно больше 0.3mb.
Поэтому даже и не знаю - можно ли больше выжать или нет. Я не пытался, необходимости не было. Возможно, что выцыганить перфоманса можно переписав часть библиотеки - там есть странные моменты. Может на обработку пакетов по прерыванию перейти... тогда меньше будет шансов потерять часть пакетов. Но это чисто теоретические соображения - нужно серъёзно поковыряться, потестить модель на стенде.
Вот еще тред: https://forum.pjrc.com/threads/45236-Accelerating-Arduino-Ethernet-Speed
Но суть, как я понимаю, сводится к следующему: берите МК с DMA, сетевой чип с Burst-mode и копируйте с него пачкой, а не побайтово, открывая каждый раз SPI-транзакцию, как в случае с W5100.
Я нашел такой документ: https://github.com/manitou48/DUEZoo/blob/master/wizperf.txt
Не знаю, насколько он правдив, на него ссылаются тут: https://forum.arduino.cc/index.php?topic=138228.0
В нем написано, что "wiznet claims only 0.3mbs for W5100, 33.3mbs for W5200" , так же там есть какие-то цифры, но я так и не понял по какой методике это считалось.
У вас же поток, если я правильно понимаю, 145*572=82,940 килобайта/сек, что составляет ~0.65mbs, что явно больше 0.3mb.
Поэтому даже и не знаю - можно ли больше выжать или нет. Я не пытался, необходимости не было. Возможно, что выцыганить перфоманса можно переписав часть библиотеки - там есть странные моменты. Может на обработку пакетов по прерыванию перейти... тогда меньше будет шансов потерять часть пакетов. Но это чисто теоретические соображения - нужно серъёзно поковыряться, потестить модель на стенде.
Вот еще тред: https://forum.pjrc.com/threads/45236-Accelerating-Arduino-Ethernet-Speed
Но суть, как я понимаю, сводится к следующему: берите МК с DMA, сетевой чип с Burst-mode и копируйте с него пачкой, а не побайтово, открывая каждый раз SPI-транзакцию, как в случае с W5100.
Я так понимаю можно для этих целей использовать шилду Ethernet 2(на W5200)? Будет в 2 раза больше памяти(можно принять будет еще больше пакетов) и скорость достаточная. И Плата с DMA есть, но опыта работы с ним нет. Что можно почитать на эту тему?
Я так понимаю можно для этих целей использовать шилду Ethernet 2(на W5200)? Будет в 2 раза больше памяти(можно принять будет еще больше пакетов) и скорость достаточная. И Плата с DMA есть, но опыта работы с ним нет. Что можно почитать на эту тему?
Тут уже можно и запутаться.
Стоковый ардуинный Ethernet2.h поддерживает чип W5500. Родной визнетовский драйвер поддерживает и W5100 и W5200 и W5500 в одной билиотеке.
На 5200 мне шилды не попадались, а вот на W5500 доступны по сходной цене. Но у этого чипа (или библиотеки - я пока не понял, но таки склоняюсь к своеобразной работе чипа) есть другая болезнь - он начинает резво реджектить все входящие коннекты, если сокеты заняты. Для моих поделок это проблема, поэтому шилд лежит на полочке.
Что почитать насчет DMA - я не знаю. У меня таких потребностей не было. Вы поставили себе задачу уровнем повыше, чем решают широкие массы, поэтому расписанных алгоритмов действий вы навряди найдете. Нужно сидеть, втыкать, анализировать код драйверов чипов и т.д.