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

Йа моск ;)
     
Группа: Модераторы
Сообщений: 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-авторизация в вебсервере сделана
Эмулятор 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.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
 |
Ответов
|
Jul 28 2011, 08:14
|

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

|
QUOTE Угу, а если стек занят (ну по другому сокету что-то отдает или удаленный хост задумался, пакет пропал и тд) и этот wakeup задерживается? Причем в общем случае он так нехило на секунды задержаться может. При этом ресурс MMC+SPI заблокирован и никто им больше пользоваться в этот момент не может (ну там логгер чего писнуть хочет). Почему? Задержка будет максимум на время приготовления или обработки пакета. Конечно, надо всегда минимизировать время обработки данных. QUOTE Еще интересно как тут с приемом. В нормальном стеке с внутренней буферизацией всегда можно четко вычислить свое окно и передать его удаленному хосту. И тут всегда можно вычислить. А иногда - например, для разбора HTTP-запросов, оно и нафиг не нужно, все делается на лету. В общем, при такой архитектуре принципиально иным должно быть построение остального кода. Только тогда будут скорости. Хотя, в общем-то и в обычных bsd-style дизайнах нельзя забывать о том, что, например, очень нежелательно кормить, скажем, функцию send по одному байту. Понятное дело, что есть буферизация, но накладные расходы на вызов будут просто феерические. А с другой стороны сама по себе bsd-style архитектура не позволяет работать с zero-copy. А zero-copy - это не только в самом стеке, но и еще и в генераторе/приемнике данных. Т.е. проблему скорости надо решать в комплексе. QUOTE А Вы тестировали точка-точка? Свич торчит 16типортовый между девайсом и большим братом. QUOTE Можно, используя RTOS и вместо колбеков флаги. Относительно легко переделывается. Там все-же сложнее ситуация. И опять-же, повторюсь, решать ее надо в комплексе. Обработчик медленный и печальный - уносите его в низкоприоритетную задачу/прерывание (я просто разноприоритетными прерываниями как неким аналогом RTOS пользуюсь), разбивайте его на подзадачи, возможно - добавляйте ему необходимые буфера.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
Сообщений в этой теме
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 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 Кстати, о максимальной пропускной способности.
Им... Jul 28 2011, 11:27 VslavX Цитата(Rst7 @ Jul 28 2011, 14:27) Буфер п... Jul 28 2011, 13:03  halfdoom Цитата(VslavX @ Jul 28 2011, 16:03) Но хр... Jul 28 2011, 14:24   VslavX Цитата(halfdoom @ Jul 28 2011, 17:24) Воз... Jul 28 2011, 14:33 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 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|