Работаем под Atollic True Studio.
Ошибка region `RAM' overflowed by 140520 bytes.
На версии 1.4.1 , модифицированной Сергеем Фетисовым под RNDIS , проблем с нехваткой памяти не возникало несмотря на то , что там еще докуче USB стек поднимался.
А вот в чистом скачанном LWIP 2.1.2 пришлось разбираться , так как упрямо не хватало памяти RAM .
USB стек мы по прежнему используем, отказываться нельзя. Но дело не в этом. Не хватает 140К при имеющихся 128К. Это совсем не шутки.
Анализируем map файл
Итак имеем результирующий файл *.map . Там есть инфа по расходу памяти . Есть такая хитрость, просто чтобы убедиться , что все соберется нормально : можно в ld файле прибавить размер RAM и все прекрасно соберется, только прошивать такой файл нельзя конечно.
В map файле натыкаемся на информацию Allocating common symbols и оказывается , что это довольно полезная вещь . Видим , что :
memp_memory_PBUF_POOL_base
memp_memory_PBUF_POOL_base
0x3b2e0 Src\core\memp.o
.....
0x2000547c memp_memory_TCP_SEG_base
0x2000579c memp_memory_PBUF_POOL_base
0x20040a7c memp_memory_FRAG_PBUF_base
Где-то для memp_memory_PBUF_POOL_base выделяется очень много памяти. Это надо выяснить ... 0x3b2e0 это размер 242400 , но в варианте с lwip1.4.1 в map файле этого нет.
PBUF_POOL_SIZE
Ответ пришел не сразу, пришлось помучаться, но смысл такой :
в проекте с LWIP 1.4.1 :
#define PBUF_POOL_SIZE 16
В проекте с 2.1.2:
#define PBUF_POOL_SIZE 400
И похоже эти цифры - килобайты. Вот так все банально оказалось.