Jump to content

    
Sign in to follow this  
mantech

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

Recommended Posts

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

Edited by mantech

Share this post


Link to post
Share on other sites

Такой вопрос поднимался в рассылке то ли разработчиков, то ли пользователей. Ответ разработчиков: "пока никак. Да, было бы неплохо иметь такую возможность, но пока никак."

Share this post


Link to post
Share on other sites
42 минуты назад, Сергей Борщ сказал:

"пока никак. Да, было бы неплохо иметь такую возможность, но пока никак."

Ясно, печально, что делать...

Share this post


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

Время жалко - штука не простая, а если делать простой, то убогий будет...

У меня простой свой. Может и убогий, но задачи свои выполняет. И да - отлично перезапускается. :wink:

Можно посмотреть на uIP. Может там есть возможность перезапуска? Если его возможностей хватит.

Share this post


Link to post
Share on other sites

Ещё можно сделать так:

Написать отдельное приложение, в котором будет только сам LwIP + таблица экспорта (Ваше API для вызова необходимых функций стека) + таблица импорта (список вызовов функций основного ПО из стека). Скомпилить его, слинковать в отдельный сегмент памяти (и отдельный регион ОЗУ), прилинковать как бинарник (или как .obj) к вашей основной программе.

Когда нужно перезапустить его: останавливаем его выполнение, запрещаем его прерывания/DMA, инитим всю использованную стеком периферию в начальное состояние, и запускаем заново с точки входа (reset-вектор).

Share this post


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

Написать отдельное приложение, в котором будет только сам LwIP + таблица экспорта (Ваше API для вызова необходимых функций стека) + таблица импорта (список вызовов функций основного ПО из стека).

Ооо, как-то брался за это дело, очень неблагодарное, скажу сразу... ИМХО, проще создать хидер с описаниями структур и глобальных переменных стека (порядка 30 структур и скол-то переменных, не считал пока) и сделать процедуру, где они тупо затрутся нулями, а потом запуск, как при первом старте...

Edited by mantech

Share this post


Link to post
Share on other sites
12 часов назад, mantech сказал:

Ооо, как-то брался за это дело, очень неблагодарное, скажу сразу...

Что там такого сложного? Вы видимо никогда не писали DLL. Они как раз так и строятся. Более кратко моё предложение можно выразить: создать DLL из LwIP. :wink:

Цитата

ИМХО, проще создать хидер с описаниями структур и глобальных переменных стека (порядка 30 структур и скол-то переменных, не считал пока) и сделать процедуру, где они тупо затрутся нулями, а потом запуск, как при первом старте...

А почему "нулями"? А если там есть не только zero-initialized переменные? А может даже и статические экземпляры классов с конструкторами есть?

Да и зачем делать какие-то костыли, которые если даже сейчас работают, то завтра (после добавления тех же статически инициализированных классов) перестанут, если можно сделать правильно?

А правильно: это значит - сэмулировать для LwIP штатный запуск firmware, на который LwIP и рассчитан. Т.е. - выполнить start-up код.

Share this post


Link to post
Share on other sites
1 час назад, jcxz сказал:

Т.е. - выполнить start-up код.

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

ЗЫ. Не понятно, почему разработчики при старте не обнуляют эти переменные, видимо лень писать, проще при любой нештатке вызвать ассерт и перезагрузить МК - но это не мой выбор...

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

Вы видимо никогда не писали DLL.

Нет не писал и пока нет желания этим заморачиваться ради одной задачи...

Share this post


Link to post
Share on other sites
В 10.09.2019 в 02:43, mantech сказал:

ак правильно остановить стек, чтоб потом его можно было снова запустить

А может быть проще не останавливать стек, а просто "остановить время" для него.

Share this post


Link to post
Share on other sites
13 часов назад, SSerge сказал:

А может быть проще не останавливать стек, а просто "остановить время" для него.

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

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