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

STM32F4 + FreeRTOS + lwip + ppp + usb modem - переполнение кучи

Добрый день!

Имеется STM32F4 с FreeRTOS и lwIP на борту. Передаю данные с использованием  PPP и USB модема. Передача реализована с помощью сокетов. Возникает ситуация, когда при таймауте ответа от сервера размер используемой кучи lwIP начинает расти, и в конце концов tcp_write() не хватает памяти для размещения очередного сегмента:

 

tcp_write(pcb=20015730, data=20001950, len=2466, apiflags=1)
tcp_write: queueing 6720:8080
mem_malloc: could not allocate 1436 bytes
tcp_write : could not allocate memory for pbuf copy size 1106
 

Кто не чистит за собой память?

 

Проблема возникает, если данные не влезают в один сегмент.

 

Изменено пользователем Алексей ВМ

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


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

А если еще выделить памяти чуть под кучу? (А сколько вообще выделили?) Не так уж и много просит. И как следует протестировать. Узкое место возможно в др. месте найдется. Сокеты видимо в состоянии ожидания и еще они не закрылись уже новые открываются.

42 минуты назад, Алексей ВМ сказал:

и USB модема.

А это как? У Вас МК в режиме хоста и к нему подключен сабж?

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


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

Выделение памяти не помогает, выделено 8К, если нет таймаутов, то максимум требуется 4К. Да, МК - хост, модем подключен девайсом. Такое впечатление, что где-то утечка памяти, но как её выявить непонятно.

Изменено пользователем Алексей ВМ

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


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

1 hour ago, Алексей ВМ said:

Выделение памяти не помогает, выделено 8К, если нет таймаутов, то максимум требуется 4К. Да, МК - хост, модем подключен девайсом. Такое впечатление, что где-то утечка памяти, но как её выявить непонятно.

 

сокеты закрываются нормально? в пул возвращаются? в стэке lwip куска кода не было для этого. можно дописать (там один иф) или как народ - два раза два раза закрывает...

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


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

lwip 2.1.2

 

9 minutes ago, kolobok0 said:

сокеты закрываются нормально? в пул возвращаются? в стэке lwip куска кода не было для этого. можно дописать (там один иф) или как народ - два раза два раза закрывает...

можно чуть подробнее, если не сложно. Как понять, что сокет норм закрылся? И где чего дописать, чтоб наверняка?

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


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

4 часа назад, Алексей ВМ сказал:

Выделение памяти не помогает, выделено 8К, если нет таймаутов, то максимум требуется 4К. Да, МК - хост, модем подключен девайсом. Такое впечатление, что где-то утечка памяти, но как её выявить непонятно.

Маловато все-таки. И еще у Вас USB хост тут. А я где-то читал, что FreeRTOS при heap_4 макс. может использовать 32КБ памяти. Если кто в курсе, то пожалуйста пусть поправят, то что выделил до этого. И поэтому я перешел на heap_5. Может и Вам попробовать? А насчет утечек памяти тут - ничего толком не могу посоветовать. Может логирование/какой-то трассировщик использовать. Когда кто-то "берет" и "отдает" память, то тут же пишем. Но Вы уже нашли место где недостача памяти происходит - это уже полдела.

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


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

Не очень понятно почему нельзя посмотреть лог и проверить, что на mem_malloc есть парный mem_free.

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


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

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

Не очень понятно почему нельзя посмотреть лог и проверить, что на mem_malloc есть парный mem_free.

Может потому, что кроме утечек памяти, может иметь место ещё и фрагментация. Поэтому утечек может и не быть, а выделять уже нечего.

 

ЗЫ: Имхо с таким объёмом ОЗУ (8К) - всяким "кучам" в проекте не место.

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


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

2 minutes ago, jcxz said:

Может потому, что кроме утечек памяти, может иметь место ещё и фрагментация. Поэтому утечек может и не быть, а выделять уже нечего.

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

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


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

4 минуты назад, x893 сказал:

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

А где там одинаковый? Уже из первого сообщения видно два разных выделяемых размера. А что там ещё автор выделяет - только ему известно (или неизвестно :wink2: )

А у него там и FreeRTOS (видимо с дин.стеками?) и USB-хост (использует кучу?).

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


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

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

кроме утечек памяти, может иметь место ещё и фрагментация. Поэтому утечек может и не быть, а выделять уже нечего

Согласен! Как я про фрагментацию тоже забыл. И тут причем требуется немалый кусок памяти (1436 байт) выделять сразу. И тут скорее всего у ТС и есть этот вариант.

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


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

1 minute ago, jcxz said:

А где там одинаковый? Уже из первого сообщения видно два разных выделяемых размера. А что там ещё автор выделяет - только ему известно (или неизвестно :wink2: )

А у него там и FreeRTOS (видимо с дин.стеками?) и USB-хост (использует кучу?).

Для этого есть лог.

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


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

5 hours ago, x893 said:

Для этого есть лог.

Обращения к самой куче не логируются.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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