Jump to content

    
Sign in to follow this  
kostya-m

FreeRTOS & uIP Stack

Recommended Posts

При исследовании готового uIP в демо версии FreeRTOS был найден баг. Если при компиляции указать размер IP пакета небольшой, меньше чем стандартный в той сети, где будем работать, например у нас в сети 1500, а я указываю 1492, то происходит такая штука:

Все что двигается без фрагментации пакетов, ходит хорошо. Фрагментация входящих пакетов так же проблем не вызывает. А вот фрагментация исходящих сбивается. После посылки первого пакета максимального размера 1492, принимающий компьютер вместо подтверждения (код 1) присылает запрос на повторную посылку (код 4) и так до конца. Из общих соображений, не должно быть проблемы, что мое устройство шлет пакеты поменьше, значит оно что-то не то указывает в пакете или при установлении связи.

Я нашел, что в FreeRTOS встроена старая версия uIPот 2003-го года. На сайте разработчиков uIP http://www.sics.se/~adam/uip/index.html есть новая версия. Однако ее код заметно усложнился, по крайней мере появилась многотридность. Ни кто не пробовал ли ее подцепить под FreeRTOS?

Share this post


Link to post
Share on other sites

Нужна была поддержка UDP, собрал франкенштейна (почти весь стек пришлось прелопатить), работало (проект заглох). Целиком не пробовал, актуальнее LwIP.

Share this post


Link to post
Share on other sites

Удалось уточнить условия возникновения бага. Оказывается, что он связан с указанием размера пакета меньше внутреннего буфера SAM7X, который равен 2048. При этом пакеты ходят любых размеров. Комментарив по этому участку кода недостаточно, может это издержки портирования на эту платформу.

Share this post


Link to post
Share on other sites

Информация для пользователей uIP.

При большой нагрузке на стек был замечен глюк потери синхронизации IP. При детальном разборе выяснилось, что пакет подтверждения Ack уходил с потребителя, а в APPCALL не приходил. В примере из поставки есть пример APPCALL, в котором все флаги пакета просматриваются эксклюзивно:

if(uip_connected()) {...}

else if(uip_closed() || uip_aborted()) {...}

else if( uip_poll() ) {...}

else if(uip_newdata()) {...}

else if(uip_rexmit()) {...}

else if(uip_acked() ) {...}

 

при детальном разборе были найдены совмещенные пакеты. Потому я обработку собственно входящего пакета объединил:

if(uip_connected()) {...}

else if(uip_closed() || uip_aborted()) {...}

else if( uip_poll() ) {...}

else {

if(uip_newdata()) {...}

if(uip_rexmit()) {...}

if(uip_acked() ) {...}

}

 

Проблема пропала.

Share this post


Link to post
Share on other sites
Информация для пользователей uIP.

Как-то uIP тут ни причем - кто-то написал приложение (не из примеров поставляемых со стеком - по крайней мере я такого безобразия не нашел в оригинальной поставке) с явными ошибками :(.

Я нашел, что в FreeRTOS встроена старая версия uIPот 2003-го года. На сайте разработчиков uIP http://www.sics.se/~adam/uip/index.html есть новая версия.

Начиная c 4.0.3 есть и образчики работы с 1.0 версией uIP полностью совпадающая с текущей версией с сайта.

Share this post


Link to post
Share on other sites

В FreeRTOS встроены два пользовательских сервера http и telnet. В этих серверах ответный пакет посылается сразу же при обработке входящего. И такой проблемы не возникает. Мне потребовалась асинхронная отсылка ответов, что может потребоваться и другим. В этом случае посылка ответов производится по событию uip_poll(). Что бы это делать чаще, чем раз в секунду, пришлось подправить стек и поднять частоту опроса. Может проблема как-то связана и с этим.

В папке uIP_Demo_IAR_ARM7 поставки FreeRTOS 4.1.3 лежит старый стек 1.62.2.10 2003/10/07 13:23:01. А на сайте 1.65 2006/06/11 21:46:39.

Share this post


Link to post
Share on other sites

Повторяю:

1. Упомяноутого Вами ошибочного кода в составе uIP не нашел, посему "катить бочку" на uIP не стоит.

Это проблема кого-то из тех, кто писал приложение. Естественно, что при использовании "микроскопических" стеков высока вероятность проблем при использованием обращений к стеку в вариантах отличающихся от условий автора :(. Нужно копать стеки достаточно глубоко, или полагаться на авось :).

2. uIP-1.0 входит в комплект FreeRTOS. Находится в .\demo\common\ethernet\uip\uip-1.0\

используется в демке для ARM9_STR91X, о чем помянуто в документации. Соответственно можно смотреть, как его прикрутил автор этой демки.

 

P.S.

К микростекам у меня интерес на данный момент почти "спортивный", по причине наличия своего обкатанного на своей шкуре с 90x годов. Однако возможно потребуется для одной учебно-левой работы использовать посторонний стек. Вот и присматриваюсь....

Share this post


Link to post
Share on other sites

У меня нет претензий к написанию стека. Был вопрос к одной из реализаций процедуры приложения. Наверно оно так работало из-за особенностей приложения. Ну, правда, не совсем нет претензий. Стек не хочет работать, если указать размер пакета не равный буферу в процессоре, равный 2К. В FreeRTOS вложен урезанный вариант, на сайте есть более наполненный и очень хорошая документация (http://www.sics.se/~adam/uip/).

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this