реклама на сайте
подробности

 
 
> Самый быстрый и самый маленький TCP-стек., По просьбам трудящихся.
Rst7
сообщение Jul 27 2011, 10:57
Сообщение #1


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Итак, по просьбам трудящихся выкладываю порт своего стека на LPC1768, выдранный из текущего проекта, над которым щас тружусь.

Прикрепленный файл  NikeE_CM3.zip ( 350.37 килобайт ) Кол-во скачиваний: 563


Собирается IAR'ом 6.20.3 (вроде крайний на текущий момент), за подправить для GCC - даже не просите.

В качестве PHY используется KSZ8041TL, что, в общем, не принципиально - править, если что, файл emac.c

Тактовая проца в проекте - 100МГц, кварц - 20МГц, менять - функция InitPLL в файле hardware_init.c

Так же для генерации 50МГц REFCLK используется сам процессор через модуль CLKOUT. Кому не надо, в файле hardware_init.c необходимо убрать
CODE
  //Нужно если 50МГц для RMII генерируется процом
  PINSEL3 |= (0x01UL<<22); //CLKOUT on P1.27
  CLKOUTCFG=0x00000110; //CLKOUT 100MHz/2=50MHz used for RMII


Стек поддерживает TCP (и серверные, и клиентские сокеты), ICMP. Очень не долго прикрутить UDP. Поддерживается Fast Retransmit на передачу. На прием - сделаю чуть позже (если, конечно, понадобится).

Архитектура стека - callback по событиям из низкоприоритетного прерывания (используется модуль RIT как таймер, необходимый для TCP и заодно происходит Wakeup этого потока при поступлении пакетов - через прерывание от EMAC, которые должно быть высокоприоритетным (но при этом очень короткое, TODO - управление Flow Control)). Сам стек - network.c.

По умолчанию IP-адрес - 192.168.0.100.

Есть вебинтерфейс, даже с поддержкой ajax - можно поставить галочку Update Graphics и повеселиться (естественно, с браузером, который понимает HTML5 - Опера, Хром, Тормозилла - все годится). Кнопки "<<" и ">>" тоже можно понажимать. Для создания и отображения этих данных копать show_data.c и HTMLsource/http_root_level3.

Еще там случайно md5-авторизация в вебсервере сделана wink.gif

Прикрепленное изображение


Эмулятор EEPROM в проекте не прикручен, так что на страничке конфигурации настройки стека не сохраняются. Когда у себя в проекте прикручу, сюда сделаю порт.

На порту 2000 висит отдаватель файла со случайными числами размером 100 мегабайт - это для теста скорости. В папочке GetData лежит проект забирателя для большого брата (собирать C++ Builder'ом).

Ну вот теперь, собственно, за скорость. По TCP - 90Мбит/с.
Прикрепленное изображение


На этом, кстати, предлагаю закончить спор о максимально достижимой скорости по TCP.

Ну размеры вообще не угадываются - 3.7кБ собственно стек, вебсервер - 3.5кБ. Ах да, там еще странички пакуются, но это осталось с версии для AVR, можно честно выбросить.

Собственно, примеры использования можно смотреть в rx_tcp_dump.c (тупой отправлятель данных) и http_server.c (веб-сервер, там берегите мозг).

Ну и на посошок - лицензии. От это все - GPL, так что пользуйтесь.

На все вопросы постараюсь ответить тут.

Добавлено 29 июня 2011г:
http://electronix.ru/forum/index.php?s=&am...st&p=956930 - ревизия 1315.

Добавлено 30 июля 2011г:
http://electronix.ru/forum/index.php?s=&am...st&p=957213 - ревизия 1318.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Jul 28 2011, 11:27
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Кстати, о максимальной пропускной способности.

Имеем максимальный пакет 1518 байт с полезной TCP-нагрузкой 1460 байт. Плюс 96 бит IFG. Итого максимальная скорость в битах в секунду по полезной нагрузке равна 95424836. И те, кто заявляет больше (например - 98 у AlexandrY wink.gif ) привирают.

QUOTE
Ну я понял Вас так - что когда надо читать данные с MMC в сокет, то вызывается колбек, на MMC посылается команда чтения сектора, и управление возвращается в стек. Потом некто в фоне прокручивает протокол MMC по SPI и по готовности снова пытаеся начать передачу в сокет. То есть - SPI занят, MMC готова давать данные, осталось только получить передающий буфер сети. А тут засада - идет передача по другому сокету, например, и все - аппаратный ресурс SPI+MMC тупо простаивает, потому как нет буфера.


Буфер появится как только освободится предыдущий. А точнее, предыдущий передается, текущий - создается. Так что никаких задержек не будет. Если, конечно, вторая задача вменяема и не генерирует данные секундами.

QUOTE
C MMC есть еще засада - SDHC карты отдают сектора только целиком, поэтому если REGENERATE будет невыравнен (а он в 99% невыравнен) по границе сектора


Это надуманная проблема. Свести выравнивание к границе сектора - цена одного пакета. Так что никакого геморроя.

QUOTE
Где тут "дульный компенсатор" который регулирует поток входящих данных?


Крутите окно заранее. В принципе, можно и небольшой буфер использовать, только без фанатизма. Вообще грамотный выбор окна и MTU - залог успеха при ограниченных объемах ОЗУ.

Кстати, а дайте-ка описание SDHC протокола карт, попробую сделать пример реализации - все одно в хозяйстве пригодится.

QUOTE
Эту работу можно вынести в отдельные .c/.h файлы так, что генерируемый код останется почти таким же самым - то есть основная идея "сплавить стек в единый кусок" не пострадает, а вот портируемость и читабельность сильно возрастет. Соответственно ценен будет для большего количества людей.


Я попробую. Хотя, честно говоря, особо не вижу смысла. Стек сей - не для бездумного ^C^V в свой проект. Сначала надо подумать, потом сделать.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jul 28 2011, 13:03
Сообщение #3


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Rst7 @ Jul 28 2011, 14:27) *
Буфер появится как только освободится предыдущий. А точнее, предыдущий передается, текущий - создается. Так что никаких задержек не будет. Если, конечно, вторая задача вменяема и не генерирует данные секундами.

Буфер-то в стеке появится, но будет отдан другому сокету, например. И пока это другой сокет не прекратит передачу - MMC будет стоять.

Цитата(Rst7 @ Jul 28 2011, 14:27) *
Крутите окно заранее. В принципе, можно и небольшой буфер использовать, только без фанатизма. Вообще грамотный выбор окна и MTU - залог успеха при ограниченных объемах ОЗУ.

Что значит крутить окно заранее? Это вообще не задача приложения - крутить окно. Вы на примере, пожалуйста, прокомментируйте - нужно писать входящий поток из сокета в MMC, просто - последовательно по секторам, без всякой файловой системы. Как это предполагается сделать и где тут "крутить окно"? Скорость ММС ну пусть будет 512байт/мс. А сети - пусть 10Кбайт/мс.

Цитата(Rst7 @ Jul 28 2011, 14:27) *
Это надуманная проблема. Свести выравнивание к границе сектора - цена одного пакета. Так что никакого геморроя.

Это не надуманная проблема, это следствие необходимости удовлетворять REGENERATE по произвольной границе при отсутствии буфера. И допустим, слать выравнено по границе сектора еще можно (вообще дикость, ну и мы ж за пропускную бьемся, да? 1460 - наше фсе sm.gif), а как это вы заставите удаленный хост подтверждать прием четко по границе сектора? То есть - в любой момент может прийти REGENERATE типа "а дайте-ка мне вот 5 байт из этого сектора и далее".

Цитата(Rst7 @ Jul 28 2011, 14:27) *
Кстати, а дайте-ка описание SDHC протокола карт, попробую сделать пример реализации - все одно в хозяйстве пригодится.

В закромах есть.

Цитата(Rst7 @ Jul 28 2011, 14:27) *
Я попробую. Хотя, честно говоря, особо не вижу смысла. Стек сей - не для бездумного ^C^V в свой проект. Сначала надо подумать, потом сделать.

Это Ваша оценка ценности этого модуля. Еще паре-тройке-десятке человек на форуме интересно обсудить теоретические вопросы. А "трудящимся", по "просьбе" которых это выложено, ценны именно читабельность и портабельность.


Цитата(AlexandrY @ Jul 28 2011, 15:51) *
В настоящей стековой архитектуре обработка на каждом этапе идет на близких данных, эффективнее используется кэш или буфер данных.

Тут вроде бы проблем с таким нету - и данные заголовка влезут в кеш и сам код обработчика тоже влезет в кеш (насчет вот колбеков вопрос открыт, правда). Но хранить MAC-адрес удаленного хоста в TCP-сокете - это готично biggrin.gif. А если нету вообще снизу MAC-адреса (кстати, а как тут с примитивной маршрутизацией - хотя бы на gw, есть такое?), например PPP вместо эзернета? А если несколько интерфейсов, один с эзернетом, другой с PPP, куда бедному TCP-сокету податься? biggrin.gif
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Jul 28 2011, 14:24
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(VslavX @ Jul 28 2011, 16:03) *
Но хранить MAC-адрес удаленного хоста в TCP-сокете - это готично biggrin.gif. А если нету вообще снизу MAC-адреса (кстати, а как тут с примитивной маршрутизацией - хотя бы на gw, есть такое?), например PPP вместо эзернета? А если несколько интерфейсов, один с эзернетом, другой с PPP, куда бедному TCP-сокету податься? biggrin.gif

Возможно я не прав, но реализация протокола от Rst7 заточена под вполне конкретное применение. Это позволяет выжать максимум скорости для данной реализации. Отсюда и MAC, и коллбэки, и не совсем четко разнесенная по уровням обработка. Но если устройство соответствует ТЗ, то это абсолютно не важно.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jul 28 2011, 14:33
Сообщение #5


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(halfdoom @ Jul 28 2011, 17:24) *
Возможно я не прав, но реализация протокола от Rst7 заточена под вполне конкретное применение. Это позволяет выжать максимум скорости для данной реализации. Отсюда и MAC, и коллбэки, и не совсем четко разнесенная по уровням обработка. Но если устройство соответствует ТЗ, то это абсолютно не важно.

А никто и не спорит - именно "заточенная" реализация, при соблюдении ряда условий и ограничений вполне имеет право на жизнь. А обсуждение - оно на то, если кто будет применять - чтобы сразу осознавал, на что подписывается.


Цитата(Rst7 @ Jul 28 2011, 17:25) *
А как еще? Именно так. Только бояться не надо, ничего сложного.

Угу, для Вас несложно, для меня несложно, а для человека, незнакомого с протоколом TCP - вполне себе может быть проблемой.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Rst7   Самый быстрый и самый маленький TCP-стек.   Jul 27 2011, 10:57
- - andrewlekar   Эмуляцию EEPROM уже хочется глянуть. У меня своя е...   Jul 27 2011, 11:09
- - Rst7   QUOTE Эмуляцию EEPROM уже хочется глянуть. А что,...   Jul 27 2011, 11:45
- - prottoss   А че он самый быстрый то? С чем сравнивалось? У мя...   Jul 27 2011, 12:33
|- - VslavX   Цитата(prottoss @ Jul 27 2011, 15:33) А ч...   Jul 27 2011, 14:54
|- - blackfin   Цитата(VslavX @ Jul 27 2011, 18:54) А вот...   Jul 27 2011, 15:36
|- - VslavX   Цитата(blackfin @ Jul 27 2011, 18:36) Мож...   Jul 27 2011, 17:08
|- - blackfin   Цитата(VslavX @ Jul 27 2011, 21:08) Я вот...   Jul 27 2011, 17:16
- - Rst7   QUOTE А че он самый быстрый то? С чем сравнивалось...   Jul 27 2011, 12:40
|- - prottoss   Цитата(Rst7 @ Jul 27 2011, 18:40) А Вы за...   Jul 27 2011, 12:50
- - Rst7   QUOTE А сколько занимает памяти TCP-сокет кстати? ...   Jul 27 2011, 13:07
|- - prottoss   Цитата(Rst7 @ Jul 27 2011, 19:07) Давайте...   Jul 27 2011, 13:20
- - Rst7   QUOTE Хорошо. Постараюсь причесать до понедельника...   Jul 27 2011, 13:24
|- - prottoss   Цитата(Rst7 @ Jul 27 2011, 19:24) Так а п...   Jul 27 2011, 13:55
|- - prottoss   Цитата(Rst7 @ Jul 27 2011, 19:24) Так а п...   Jul 28 2011, 08:03
- - scifi   Интересная штука. Эх, причесать бы код и абстрагир...   Jul 27 2011, 14:01
|- - prottoss   Цитата(scifi @ Jul 27 2011, 20:01) Эх, пр...   Jul 27 2011, 14:13
|- - zltigo   QUOTE (scifi @ Jul 27 2011, 16:01) Эх, пр...   Jul 27 2011, 14:28
- - Rst7   QUOTE Эх, причесать бы код и абстрагировать от жел...   Jul 27 2011, 14:27
|- - prottoss   Цитата(Rst7 @ Jul 27 2011, 20:27) Так - п...   Jul 27 2011, 15:09
- - Rst7   QUOTE Судя по скорости работы с конкретным железом...   Jul 27 2011, 14:48
- - Rst7   QUOTE Может быть, обсудим методику тестирования пр...   Jul 27 2011, 15:08
- - Rst7   QUOTE Чего там оно просит? В windows/drivers/etc/...   Jul 27 2011, 15:23
- - Rst7   QUOTE Я вот жду LPC18xx - у него EMAC продвинутый,...   Jul 27 2011, 18:24
|- - VslavX   Цитата(Rst7 @ Jul 27 2011, 21:24) Однако ...   Jul 27 2011, 20:57
- - Rst7   QUOTE Можно, например, Ethereal'ом протестиров...   Jul 27 2011, 20:34
|- - blackfin   Цитата(Rst7 @ Jul 28 2011, 00:34) Только ...   Jul 28 2011, 04:15
- - Rst7   QUOTE Ну, допустим, не в два, а чуть больше чем в ...   Jul 27 2011, 21:28
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 00:28) Имеем з...   Jul 28 2011, 06:08
- - halfdoom   Цитата(Rst7 @ Jul 27 2011, 13:57) Ну вот ...   Jul 28 2011, 04:04
- - andrewlekar   ЦитатаА что, собственно стек не интересен? Не особ...   Jul 28 2011, 04:19
- - Rst7   QUOTE Их никто и не складывает. Данные идут в одно...   Jul 28 2011, 06:39
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 09:39) А оно-т...   Jul 28 2011, 07:36
- - Rst7   Подумал про передачу данных, например, с MMC. Да, ...   Jul 28 2011, 07:48
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 10:39) прерыва...   Jul 28 2011, 07:56
- - Rst7   QUOTE Угу, а если стек занят (ну по другому сокету...   Jul 28 2011, 08:14
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 11:14) Почему?...   Jul 28 2011, 10:53
- - AlexandrY   Цитата(Rst7 @ Jul 27 2011, 13:57) Итак, п...   Jul 28 2011, 10:08
- - Rst7   QUOTE и вижу вы даже не пытались оптимизировать ра...   Jul 28 2011, 10:30
|- - AlexandrY   Цитата(Rst7 @ Jul 28 2011, 13:30) Именно ...   Jul 28 2011, 12:51
- - Rst7   QUOTE Что значит крутить окно заранее? Это вообще ...   Jul 28 2011, 13:33
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 16:33) Для так...   Jul 28 2011, 14:10
- - Rst7   QUOTE Угу, и еще залезли в s->win и сделали его...   Jul 28 2011, 14:25
- - Rst7   QUOTE а для человека, незнакомого с протоколом TCP...   Jul 28 2011, 14:52
|- - blackfin   Цитата(Rst7 @ Jul 28 2011, 18:52) Более т...   Jul 28 2011, 15:18
|- - zltigo   QUOTE (blackfin @ Jul 28 2011, 18:18) Ага...   Jul 28 2011, 17:32
|- - blackfin   Цитата(zltigo @ Jul 28 2011, 21:32) При э...   Jul 28 2011, 18:31
|- - zltigo   QUOTE (blackfin @ Jul 28 2011, 21:31) и и...   Jul 28 2011, 18:50
|- - VslavX   Цитата(zltigo @ Jul 28 2011, 21:50) Прими...   Jul 28 2011, 19:08
|- - zltigo   QUOTE (VslavX @ Jul 28 2011, 22:08) А что...   Jul 28 2011, 19:19
|- - VslavX   Цитата(zltigo @ Jul 28 2011, 22:19) Там д...   Jul 28 2011, 19:32
|- - zltigo   QUOTE (VslavX @ Jul 28 2011, 22:32) И что...   Jul 28 2011, 19:43
- - Rst7   QUOTE Ага, вот тут и встает наш Главный холиварный...   Jul 28 2011, 16:13
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 19:13) Да поро...   Jul 28 2011, 17:56
- - yakub_EZ   IAR 6.21.1.2846 и common components 6.3.3.1990. П...   Jul 28 2011, 16:18
- - Rst7   QUOTE При компиляции просит revision.c, где его вз...   Jul 28 2011, 16:36
- - Rst7   QUOTE ИМХО, как раз LPC17xx неудачно выбран для ил...   Jul 28 2011, 19:23
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 22:23) конечно...   Jul 28 2011, 19:45
- - Rst7   QUOTE и похоже таки со 100% загрузкой ядра (раз 92...   Jul 28 2011, 20:04
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 23:04) Ну я по...   Jul 28 2011, 20:20
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 23:04) А вот т...   Jul 28 2011, 20:36
- - Rst7   QUOTE Хм, а разве он их генерирует, а не просто бе...   Jul 28 2011, 20:28
|- - VslavX   Цитата(Rst7 @ Jul 28 2011, 23:28) Распако...   Jul 28 2011, 20:44
|- - aaarrr   Цитата(Rst7 @ Jul 29 2011, 00:28) Да ладн...   Jul 28 2011, 22:06
- - Rst7   QUOTE Это для пакета в 1460 байт? Примерно 1 такт ...   Jul 28 2011, 20:43
- - Rst7   QUOTE А что - на PIO получится 25МГц выдать? Ну п...   Jul 28 2011, 20:55
- - Rst7   ЦитатаА еще придется CRC16 считать для каждой из ч...   Jul 29 2011, 06:59
- - Rst7   QUOTE Не стоит овчинка выделки - сделать можно, но...   Jul 29 2011, 08:18
- - Rst7   Сделал правильный отправлятель пакетов (без тупого...   Jul 29 2011, 10:00
|- - RA3WUM   Rst7 Сколько данный стек занимает RAM? В LPC1114 ...   Jul 29 2011, 15:28
- - Rst7   QUOTE Сколько данный стек занимает RAM? В LPC1114 ...   Jul 29 2011, 19:02
|- - RA3WUM   Цитата(Rst7 @ Jul 29 2011, 23:02) Или как...   Jul 29 2011, 19:26
- - Rst7   QUOTE Соответсвенно скорость порядка 96-192 кБит/с...   Jul 29 2011, 19:41
|- - RA3WUM   Цитата(Rst7 @ Jul 29 2011, 23:41) Источни...   Jul 29 2011, 19:59
- - Rst7   QUOTE Если не ошибаюсь на вашем стеке уже делали и...   Jul 29 2011, 20:36
|- - RA3WUM   Цитата(Rst7 @ Jul 30 2011, 00:36) Да. Но ...   Jul 29 2011, 20:57
- - Rst7   QUOTE Но в моём случае что есть под рукой, от того...   Jul 29 2011, 21:37
|- - RA3WUM   Цитата(Rst7 @ Jul 30 2011, 01:37) VS1053 ...   Jul 30 2011, 11:56
- - Rst7   Поигрался с dummynet, подправил некоторые неточнос...   Jul 30 2011, 08:57
- - VslavX   Небольшой апдейт про "Машу" Включил клю...   Jul 30 2011, 12:32
|- - prottoss   Цитата(VslavX @ Jul 30 2011, 18:32) Небол...   Jul 30 2011, 12:39
|- - VslavX   Цитата(prottoss @ Jul 30 2011, 15:39) Дак...   Jul 30 2011, 12:53
|- - prottoss   Цитата(VslavX @ Jul 30 2011, 18:53) Почем...   Jul 30 2011, 13:03
- - Rst7   QUOTE Имхо, вполне приличный результат для полноце...   Jul 30 2011, 12:56
|- - VslavX   Цитата(Rst7 @ Jul 30 2011, 15:56) Ага, из...   Jul 30 2011, 13:08
- - Rst7   QUOTE Где на LPC17 взять такой реальный поток данн...   Jul 30 2011, 13:04
- - Rst7   QUOTE Так что проигрыш всего 10 процентов скорости...   Jul 30 2011, 13:13
|- - VslavX   Цитата(Rst7 @ Jul 30 2011, 16:13) Проигры...   Jul 30 2011, 13:29
- - Rst7   QUOTE а еще Out-of-Order Segments и Selective ACK ...   Jul 30 2011, 13:39
|- - VslavX   Цитата(Rst7 @ Jul 30 2011, 16:39) Я с одн...   Jul 30 2011, 14:10
- - Rst7   QUOTE хотя, если тут перейти на RTOS, то это свою ...   Jul 30 2011, 14:39
|- - zltigo   QUOTE (Rst7 @ Jul 30 2011, 16:39) Не пора...   Jul 30 2011, 15:10
|- - VslavX   Цитата(Rst7 @ Jul 30 2011, 17:39) Не пора...   Jul 30 2011, 15:21
- - Rst7   QUOTE Написание и использование RTOS (кстати, ои о...   Jul 30 2011, 15:21
|- - VslavX   Цитата(Rst7 @ Jul 30 2011, 18:21) Да я не...   Jul 30 2011, 15:38
- - Rst7   QUOTE Угу, все именно так. Поэтому malloc/free у м...   Jul 30 2011, 15:34
2 страниц V   1 2 >


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 08:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016