Перейти к содержанию
    

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

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

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 минуты назад, Сергей Борщ сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 минут назад, jcxz сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, jcxz сказал:

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

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

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, mantech сказал:

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

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

Цитата

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 10.09.2019 в 02:43, mantech сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, SSerge сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...