mantech 53 9 сентября, 2019 Опубликовано 9 сентября, 2019 (изменено) · Жалоба Приветствую. Собственно простой вопрос - как правильно остановить стек, чтоб потом его можно было снова запустить без перезагрузки контроллера? Просто "в лоб" lwip_init() и т.п. не выходит - виснет... Предполагаю, что надо что-то очищать, структуры, память, только что и где - пока не понятно... Изменено 9 сентября, 2019 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба Такой вопрос поднимался в рассылке то ли разработчиков, то ли пользователей. Ответ разработчиков: "пока никак. Да, было бы неплохо иметь такую возможность, но пока никак." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба 42 минуты назад, Сергей Борщ сказал: "пока никак. Да, было бы неплохо иметь такую возможность, но пока никак." Ясно, печально, что делать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба 55 минут назад, mantech сказал: Ясно, печально, что делать... Написать свой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба 28 минут назад, jcxz сказал: Написать свой Время жалко - штука не простая, а если делать простой, то убогий будет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба 8 минут назад, mantech сказал: Время жалко - штука не простая, а если делать простой, то убогий будет... У меня простой свой. Может и убогий, но задачи свои выполняет. И да - отлично перезапускается. Можно посмотреть на uIP. Может там есть возможность перезапуска? Если его возможностей хватит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба Загоните все RW-данные LwIP в отдельную секцию, сделайте снэпшот, перед перезапуском разверните. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба 1 час назад, aaarrr сказал: Загоните все RW-данные LwIP в отдельную секцию, Наверно, жаль, что они "разбросаны" по всему стеку... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 сентября, 2019 Опубликовано 10 сентября, 2019 · Жалоба Ещё можно сделать так: Написать отдельное приложение, в котором будет только сам LwIP + таблица экспорта (Ваше API для вызова необходимых функций стека) + таблица импорта (список вызовов функций основного ПО из стека). Скомпилить его, слинковать в отдельный сегмент памяти (и отдельный регион ОЗУ), прилинковать как бинарник (или как .obj) к вашей основной программе. Когда нужно перезапустить его: останавливаем его выполнение, запрещаем его прерывания/DMA, инитим всю использованную стеком периферию в начальное состояние, и запускаем заново с точки входа (reset-вектор). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 10 сентября, 2019 Опубликовано 10 сентября, 2019 (изменено) · Жалоба 37 минут назад, jcxz сказал: Написать отдельное приложение, в котором будет только сам LwIP + таблица экспорта (Ваше API для вызова необходимых функций стека) + таблица импорта (список вызовов функций основного ПО из стека). Ооо, как-то брался за это дело, очень неблагодарное, скажу сразу... ИМХО, проще создать хидер с описаниями структур и глобальных переменных стека (порядка 30 структур и скол-то переменных, не считал пока) и сделать процедуру, где они тупо затрутся нулями, а потом запуск, как при первом старте... Изменено 10 сентября, 2019 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 11 сентября, 2019 Опубликовано 11 сентября, 2019 · Жалоба 12 часов назад, mantech сказал: Ооо, как-то брался за это дело, очень неблагодарное, скажу сразу... Что там такого сложного? Вы видимо никогда не писали DLL. Они как раз так и строятся. Более кратко моё предложение можно выразить: создать DLL из LwIP. Цитата ИМХО, проще создать хидер с описаниями структур и глобальных переменных стека (порядка 30 структур и скол-то переменных, не считал пока) и сделать процедуру, где они тупо затрутся нулями, а потом запуск, как при первом старте... А почему "нулями"? А если там есть не только zero-initialized переменные? А может даже и статические экземпляры классов с конструкторами есть? Да и зачем делать какие-то костыли, которые если даже сейчас работают, то завтра (после добавления тех же статически инициализированных классов) перестанут, если можно сделать правильно? А правильно: это значит - сэмулировать для LwIP штатный запуск firmware, на который LwIP и рассчитан. Т.е. - выполнить start-up код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 11 сентября, 2019 Опубликовано 11 сентября, 2019 · Жалоба 1 час назад, jcxz сказал: Т.е. - выполнить start-up код. В том-то и дело, что нет там этого стартап кода... Есть кол-во структур и переменных, как правило без инициализации какими-то значениями, а значит это нули. Разбросаны они по разным файлам стека, что не гуд в моем понимании, поэтому заново проинитить их - это "собрать" в одном месте и обнулить, это и будет стартап код... ЗЫ. Не понятно, почему разработчики при старте не обнуляют эти переменные, видимо лень писать, проще при любой нештатке вызвать ассерт и перезагрузить МК - но это не мой выбор... 1 час назад, jcxz сказал: Вы видимо никогда не писали DLL. Нет не писал и пока нет желания этим заморачиваться ради одной задачи... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 11 сентября, 2019 Опубликовано 11 сентября, 2019 · Жалоба В 10.09.2019 в 02:43, mantech сказал: ак правильно остановить стек, чтоб потом его можно было снова запустить А может быть проще не останавливать стек, а просто "остановить время" для него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 12 сентября, 2019 Опубликовано 12 сентября, 2019 · Жалоба 13 часов назад, SSerge сказал: А может быть проще не останавливать стек, а просто "остановить время" для него. Тут другая задача, повысить надежность системы, т.е. при наличии какой-либо внештатки (внутренняя ошибка, переполнение памяти и пр...) можно было перезапустить стек не перезагружая систему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GeorgK 1 13 сентября, 2019 Опубликовано 13 сентября, 2019 · Жалоба Может, при сборке загнать все изменяемые переменные стека в отдельный сегмент, и целиком обнулять его при необходимости? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться