Jump to content

    

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

Приветствую. Собственно простой вопрос - как правильно остановить стек, чтоб потом его можно было снова запустить без перезагрузки контроллера? Просто "в лоб" 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
55 минут назад, mantech сказал:

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

Написать свой  :wink:

Share this post


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

Написать свой  

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

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites

Загоните все RW-данные LwIP в отдельную секцию, сделайте снэпшот, перед перезапуском разверните.

Share this post


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

Загоните все RW-данные LwIP в отдельную секцию,

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

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

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

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