-
- Проблема глубже оказалась. Если выполнить нагрузочное тестирование
системы (я бесконечно шлю запросы 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)