Jump to content

    

LwIP Корректное завершение

1 час назад, GeorgK сказал:

Может, при сборке загнать все изменяемые переменные стека в отдельный сегмент, и целиком обнулять его при необходимости?

Неа, не получится. Вообщем - идея изначально "гнилая" - сэмулировал несколько нештатных ситуаций, реально надежного выхода из них нет, разве, что только "оформлять" весь этот стек ввиде вытесняющей задачи и потом, при сваливании в аборт - задачу полностью глушить, обнулять все стеки переменных и запускать заново, иначе с вероятностью 50% уходит в hardfault или еще куда, вообщем виснет намертво.

Отсюда вопрос, в чем принципиальное отличие uIP от LwIP? 

Сразу скажу, DNS,DHCP, SNMP не используются, Нужна работа с TCP пакетами, и верхний уровень - HTTP, FTP, Telnet, modbus-tcp

Share this post


Link to post
Share on other sites
3 минуты назад, mantech сказал:

что только "оформлять" весь этот стек ввиде вытесняющей задачи и потом, при сваливании в аборт - задачу полностью глушить, обнулять все стеки переменных и запускать заново, иначе с вероятностью 50% уходит в hardfault или еще куда, вообщем виснет намертво.

Ну вот. Я сразу ведь писал.  :wink:

Только так и делать, да плюс - стартап полноценный и инит периферии в начальное состояние. Т.е. - что я писал в первом предложении.

3 минуты назад, mantech сказал:

Сразу скажу, DNS,DHCP, SNMP не используются, Нужна работа с TCP пакетами, и верхний уровень - HTTP, FTP, Telnet, modbus-tcp

Имхо - такое и самый "убогий" стек потянет. Хотя думаю что и для него для перезапуска нужен реинит периферии и нормальный стартап.  :unknw:

Share this post


Link to post
Share on other sites
23 minutes ago, mantech said:

Неа, не получится.

Не может не получиться. Если восстановлены RW и ZI-данные, то перезапуск ничем не отличается от обычного старта.

Share this post


Link to post
Share on other sites
1 минуту назад, aaarrr сказал:

Не может не получиться. Если восстановлены RW и ZI-данные, то перезапуск ничем не отличается от обычного старта.

Обычный старт выполняется на reset-state значениях в регистрах периферии. И в регистрах внешнего чипа Phy ethernet.

Share this post


Link to post
Share on other sites
1 minute ago, jcxz said:

Обычный старт выполняется на reset-state значениях в регистрах периферии. И в регистрах внешнего чипа Phy ethernet.

Речь о стеке LwIP, периферийные драйверы к нему уж никак не относятся.

Но разве что-то мешает сбросить MAC и PHY, и перезагрузить драйверы аналогичным образом?

Share this post


Link to post
Share on other sites

там еще обрабатываемые пакеты могут в общей куче (heap) находиться. Как-то их оттуда вычленить и освободить память будет очень непросто.

Share this post


Link to post
Share on other sites
15 minutes ago, Сергей Борщ said:

там еще обрабатываемые пакеты могут в общей куче (heap) находиться. Как-то их оттуда вычленить и освободить память будет очень непросто.

Тут или не ипользовать общую кучу в lwIP (по умолчанию так, если не ошибаюсь), или добавить обертку над системными malloc/free для стека.

Share this post


Link to post
Share on other sites

У lwIP есть свой менеджер памяти (это настраивается в заголовочном файле), ему просто выделяется область памяти, которой он будет распоряжаться. Так что в этой части вопросов возникнуть не должно. А если есть многозадачность, почему бы тогда не прибивать эту задачу и пускать заново? А что касается низкого уровня, ему нужны только функции "принять пакет" и "послать пакет", так что их можно и не трогать - ну придёт из очереди старый пакет и будет проигнорирован. А uIP многозадачность вообще не нужна, но возможно именно поэтому мне не удалось подружить его с телнетом - консоль выполнения команд всё-таки логично делать как отдельный поток.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now