-
- Ура! Заработало! Проблема была в том, что не хватало места под
таймеры FDA(705 знак., 06.10.2024 19:24, ссылка)
- Проблема глубже оказалась. Если выполнить нагрузочное тестирование
системы (я бесконечно шлю запросы walk по SNMP, отправляю короткие
запросы по UDP и обновляю Web-интерфейс), то максимум за 20 сек
получаю глухой зависон. FDA(123 знак., 07.10.2024 09:43)
- Размер кучи контролируется? - Nikolay_Po(07.10.2024 15:40)
- А где это должно контролироваться? Для задач lwIP выделяется
статическая память, в пределах неё стек уже создаёт буферы под свои
задачи, кол-во задал с запасом. Но сейчас легко могу сделать
зависон при непрерывном опросе по SNMP и обмену по чистому UDP.
Настроил сторожевой таймер. Сбрасываю его в основном цикле. Вижу
периодические сбросы платы. - FDA(07.10.2024 15:52)
- Ну, где-то в этой теме я видел про выделение места таймерам в куче.
Нужно проверить, что ещё в кучу попадает и как она заполняется, нет
ли исключений по невозможности выделить память? Nikolay_Po(137 знак., 07.10.2024 15:59)
- Спасибо огромное за подсказку!!! В стартапе размер кучи был всего
0x200, увеличил до 0x800 и всё заработало!!!! В настройках среды (у
меня Keil) это не задаётся, ручками прописал и вуаля! Я два дня с
отладчиком сидел, а оказывается просто всё. Вот как бы ещё
контролировать выделение памяти и куда-то прыгать при переполнении,
чтобы понятно было что проблема с этим. - FDA(07.10.2024 16:24)
- Вообще, поднять SNMPv3 - это круто! - Nikolay_Po(08.10.2024 14:01)
- Да, очень тяжёлый протокол. Видимо, кто-то в шутку его в своё время Simple назвал :-) Меня сейчас смущает только то, что пока не смог mdebTLS свежую к нему прикрутить. Юзаю какую-то старую версию от какого-то проекта на гитхабе под STM32. Но тут надо отдельно будет ещё разбираться. Очень мало информации по всему этому делу, к сожалению. - FDA(08.10.2024 14:08)
- Почитайте по теме кучи. Там способы, типа заполнения свободного места между кучей и стеком известным кодовым узором и регулярная проверка, сколько этого узора осталось не затёртым. Так и узнаете, хватает ли вам памяти на стек и на кучу. - Nikolay_Po(07.10.2024 17:19)
- У меня в некоторых проектах штатные функции выделения памяти в куче
подменены на мои собственные как раз с такой проверкой (и защитой
от одновременного вызова разными процессами). У меня оно прыгает на
принудительную перезагрузку, правда, такого давно уже не случалось. - AlexG(07.10.2024 16:45)
- А я делаю проверку кучи штатными средствами - в цикле с помощью
alloc/free нахожу максимальный размер блока, который может
предоставить система. Надо только быть внимательным в случае
многозадачной системы - запрещать переключение задач в момент между
alloc и free, чтобы не обломать выделение памяти в соседней задаче.
А без RTOS - так вообще нет проблем. - il-2(08.10.2024 07:17)
- А можете пример прислать как именно делаете? У нас программа без
RTOS сейчас. - FDA(08.10.2024 14:06)
- Вот такую функцию я наваял. Это для МК CH57x / 58x / 59x. Там библиотека BLE и событийная ОС использует свою кучу. il-2(774 знак., 08.10.2024 15:04)
- А можете пример прислать как именно делаете? У нас программа без
RTOS сейчас. - FDA(08.10.2024 14:06)
- Спасибо. Как организовали подмену? Переопределением? Или просто
ручками во всех местах вызова? Для меня такое пока не очевидно. - Nikolay_Po(07.10.2024 17:05)
- в IARе в опциях линкера: AlexG(411 знак., 09.10.2024 03:28)
- Спасибо. Интересно было бы узнать, как подобное делается в GCC. - Nikolay_Po(09.10.2024 09:08)
- --wrap >>> SciFi(1 знак., 09.10.2024 09:14, ссылка)
- Отлично. Спасио. Премного благодарен. - Nikolay_Po(09.10.2024 09:55)
- --wrap >>> SciFi(1 знак., 09.10.2024 09:14, ссылка)
- Спасибо. Интересно было бы узнать, как подобное делается в GCC. - Nikolay_Po(09.10.2024 09:08)
- в IARе в опциях линкера: AlexG(411 знак., 09.10.2024 03:28)
- А я делаю проверку кучи штатными средствами - в цикле с помощью
alloc/free нахожу максимальный размер блока, который может
предоставить система. Надо только быть внимательным в случае
многозадачной системы - запрещать переключение задач в момент между
alloc и free, чтобы не обломать выделение памяти в соседней задаче.
А без RTOS - так вообще нет проблем. - il-2(08.10.2024 07:17)
- Был рад помочь. Я глубоко кучу не копал, но, вроде, там могут быть функции: а) узнать какого размера куча; б) Коллбек в случае отказа выделения памяти. Ну или ищите все места аллокации и вставляйте проверки туда вручную. - Nikolay_Po(07.10.2024 16:38)
- Вообще, поднять SNMPv3 - это круто! - Nikolay_Po(08.10.2024 14:01)
- Спасибо огромное за подсказку!!! В стартапе размер кучи был всего
0x200, увеличил до 0x800 и всё заработало!!!! В настройках среды (у
меня Keil) это не задаётся, ручками прописал и вуаля! Я два дня с
отладчиком сидел, а оказывается просто всё. Вот как бы ещё
контролировать выделение памяти и куда-то прыгать при переполнении,
чтобы понятно было что проблема с этим. - FDA(07.10.2024 16:24)
- Ну, где-то в этой теме я видел про выделение места таймерам в куче.
Нужно проверить, что ещё в кучу попадает и как она заполняется, нет
ли исключений по невозможности выделить память? Nikolay_Po(137 знак., 07.10.2024 15:59)
- А где это должно контролироваться? Для задач lwIP выделяется
статическая память, в пределах неё стек уже создаёт буферы под свои
задачи, кол-во задал с запасом. Но сейчас легко могу сделать
зависон при непрерывном опросе по SNMP и обмену по чистому UDP.
Настроил сторожевой таймер. Сбрасываю его в основном цикле. Вижу
периодические сбросы платы. - FDA(07.10.2024 15:52)
- Размер кучи контролируется? - Nikolay_Po(07.10.2024 15:40)
- Проблема глубже оказалась. Если выполнить нагрузочное тестирование
системы (я бесконечно шлю запросы walk по SNMP, отправляю короткие
запросы по UDP и обновляю Web-интерфейс), то максимум за 20 сек
получаю глухой зависон. FDA(123 знак., 07.10.2024 09:43)
- Если не секрет, какого типа оборудование? По идее, должно быть
что-то около-сетевое. Для моих разработок, пока не возникало
потребности в реализации SNMP вообще. Но у меня сетевого пока и не
было. - Nikolay_Po(06.10.2024 17:46)
- SNMP-карта мониторинга ИБП. Мы давно выпускаем такие на базе PIC18.
Там всё работает, всё устраивает, но в последнее время от
заказчиков пошли требования по наличию SNMPv3. Новую версию сделали
на базе Artery AT32F407 и стека lwIP. В целом почти всё, что нужно
запустили, даже вот SNMPv3 я сегодня наконец запустил, все
шифрования и авторизацию отрабатывает, но упёрся в проблему с TCP.
Мне ещё пришлось старый стек mbedTLS использовать от какого-то
проекта для STM32. FDA(216 знак., 06.10.2024 18:08)
- Коллега! У меня такой же чип и тот же стек, только я еще на
начальном этапе. Можете сказать как вы делаете? Т.е. какой у вас
PHY? Стек используете в варианте с ОС или без? Если с ОС то
FreeRTOS? При портировании lwIP использовали пример от
производителя без особых изменений, или доделывали, или
использовали порт от другого чипа, или вообще свой сделали? - AlexBi(07.10.2024 08:26)
- PHY у нас DM9162IEP. RTOS не используем. задача была как можно
быстрее перенести код со старой платформы. Сама схема по сути взята
с отладочной платы AT-START-F407. Только в линиях PHY добавили
последовательные резисторы. Примеры от производителя работают без
проблем. Самое долгое - это разбираться с настройкой всех
протоколов, а ещё со встраиванием их в реальный проект. В примерах
обычно как, вот так включаем DHCP, проверяем, бац, всё работает! А
в реальной жизни надо FDA(1060 знак., 13.11.2024 21:31)
- На CycloneTCP не смотрели? HTTP и SNMP там есть, всё остальное что
вам нужно весьма вероятно тоже - AlexG(14.11.2024 06:31)
- Смотрел, но инфы по нему крайне мало. Поэтому не знаю как
подступиться к нему. Если кто имеет опыт работы с этим стеком -
пишите в личку, можем поработать в этом направлении. - FDA(14.11.2024 08:31)
- Или читать примеры или таки купить, тогда дадут документацию. AlexG(84 знак., 17.11.2024 05:43)
- Смотрел, но инфы по нему крайне мало. Поэтому не знаю как
подступиться к нему. Если кто имеет опыт работы с этим стеком -
пишите в личку, можем поработать в этом направлении. - FDA(14.11.2024 08:31)
- Помнится, я выпилил SNMP из MQX RTCS. А так у меня lwip. Было это давно, с тех пор так и работает. Там SNMP на стек почти не завязан, нужно только уметь принять и отправить UDP. - SciFi(13.11.2024 21:41)
- На CycloneTCP не смотрели? HTTP и SNMP там есть, всё остальное что
вам нужно весьма вероятно тоже - AlexG(14.11.2024 06:31)
- PHY у нас DM9162IEP. RTOS не используем. задача была как можно
быстрее перенести код со старой платформы. Сама схема по сути взята
с отладочной платы AT-START-F407. Только в линиях PHY добавили
последовательные резисторы. Примеры от производителя работают без
проблем. Самое долгое - это разбираться с настройкой всех
протоколов, а ещё со встраиванием их в реальный проект. В примерах
обычно как, вот так включаем DHCP, проверяем, бац, всё работает! А
в реальной жизни надо FDA(1060 знак., 13.11.2024 21:31)
- Очень хорошая задача. Прям рад за вас! Пробовал копнуть SNMP, в своё время - для меня слишком сложным показался. Наверное, до сих пор не вырос. Удачи и чёткой победы, чтобы прям работало и никому не удалось найти ни бага! - Nikolay_Po(06.10.2024 18:11)
- Коллега! У меня такой же чип и тот же стек, только я еще на
начальном этапе. Можете сказать как вы делаете? Т.е. какой у вас
PHY? Стек используете в варианте с ОС или без? Если с ОС то
FreeRTOS? При портировании lwIP использовали пример от
производителя без особых изменений, или доделывали, или
использовали порт от другого чипа, или вообще свой сделали? - AlexBi(07.10.2024 08:26)
- SNMP-карта мониторинга ИБП. Мы давно выпускаем такие на базе PIC18.
Там всё работает, всё устраивает, но в последнее время от
заказчиков пошли требования по наличию SNMPv3. Новую версию сделали
на базе Artery AT32F407 и стека lwIP. В целом почти всё, что нужно
запустили, даже вот SNMPv3 я сегодня наконец запустил, все
шифрования и авторизацию отрабатывает, но упёрся в проблему с TCP.
Мне ещё пришлось старый стек mbedTLS использовать от какого-то
проекта для STM32. FDA(216 знак., 06.10.2024 18:08)
- Так, каким-то чудом я всё таки запустил SNMPv3. Но работает всё
крайне нестабильно. При запросах HTTP, а иногда и простых UDP
прошивка перестаёт работать. Раз через раз отладчик показывается,
что мы всё время попадаем в функцию FDA(98 знак., 06.10.2024 15:31)
- Похоже на weak-функцию - заглушку, которую интегратор должен
добавить сам. - Nikolay_Po(06.10.2024 17:40)
- Похоже на printf. Собрано с включенной отладкой, срабатывает ASSERT
и что-то хочет нам сказать. Всё, на сегодня телепатический дар
исчерпан. - SciFi(06.10.2024 17:42)
- Отладчик показал, что вылетаю туда при обработке запроса TCP вот в
этом месте: FDA(321 знак., 06.10.2024 17:58)
- Условие while где? А что говорит трассировка? С какого места
переход на заглушку? - Nikolay_Po(06.10.2024 18:12)
- В функции tcp_listen_input вызывается этот макрос: FDA(261 знак., 06.10.2024 18:25)
- Что-то вы не договариваете. Если while(1), значит, срабатывание по таймауту происходит. По какому? По тому, по которому вызывается макрос? А если прошагать? С чего прыжок? Условие какое-то должно быть, должно сработать. Ну и наполнение этого вывода какое-то осмысленное должно быть. Нужно его поймать. Nikolay_Po(116 знак., 06.10.2024 18:34)
- do { ... } while (1) жеж, это обычная фишка в макросах. И
правильный вопрос такой: почему не включили отладочный выхлоп и не
посмотрели на него? LWIP довольно много отладочной информации может
выдавать. - SciFi(06.10.2024 18:17)
- Почему (1) если (0) жеж. - ASDFSUSB-гуру(06.10.2024 18:54)
- ачепятка - SciFi(06.10.2024 19:30)
- Тогда покажите, откуда, из какого ветвления, идёт переход на
заглушку? Нужно размотать взад. - Nikolay_Po(06.10.2024 18:57)
- Сорян, я в ваших лвипах как баран в апельсинах ASDFSUSB-гуру(113 знак., 06.10.2024 19:20)
- Докопался по до этого места: FDA(603 знак., 06.10.2024 19:08)
- Тю, точно! Это же макрос. Просто выделили блок кода, чтобы не разрывался. - Nikolay_Po(06.10.2024 18:57)
- Тут проблема в том, что я сейчас работаю удалённо, а сама плата в офисе. Поэтому только отладчик могу использовать. - FDA(06.10.2024 18:24)
- Почему (1) если (0) жеж. - ASDFSUSB-гуру(06.10.2024 18:54)
- В функции tcp_listen_input вызывается этот макрос: FDA(261 знак., 06.10.2024 18:25)
- Условие while где? А что говорит трассировка? С какого места
переход на заглушку? - Nikolay_Po(06.10.2024 18:12)
- +1. - Nikolay_Po(06.10.2024 17:43)
- Отладчик показал, что вылетаю туда при обработке запроса TCP вот в
этом месте: FDA(321 знак., 06.10.2024 17:58)
- Похоже на printf. Собрано с включенной отладкой, срабатывает ASSERT
и что-то хочет нам сказать. Всё, на сегодня телепатический дар
исчерпан. - SciFi(06.10.2024 17:42)
- Похоже на weak-функцию - заглушку, которую интегратор должен
добавить сам. - Nikolay_Po(06.10.2024 17:40)
- Генерация случайных чисел. Что там под дифаном
MBEDTLS_NO_PLATFORM_ENTROPY? - Nikolay_Po(06.10.2024 14:59)
- Да он просто закомментирован был. Но это ничего не изменило, только
в другом месте эта ошибка вылезла. Но с этим ещё можно разобраться.
А Вот то, что модуль timing.c требует unistd.h, которого нет, я не
знаю что делать :-) - FDA(06.10.2024 15:04)
- Это к POSIX относится, по идее, должно как-то выпилиться, дефайнами. Надо как-то объяснить библиотеке, что у нас совсем не POSIX. Nikolay_Po(1 знак., 06.10.2024 15:08, ссылка)
- Да он просто закомментирован был. Но это ничего не изменило, только
в другом месте эта ошибка вылезла. Но с этим ещё можно разобраться.
А Вот то, что модуль timing.c требует unistd.h, которого нет, я не
знаю что делать :-) - FDA(06.10.2024 15:04)
- Ура! Заработало! Проблема была в том, что не хватало места под
таймеры FDA(705 знак., 06.10.2024 19:24, ссылка)