jcxz 242 24 декабря, 2012 Опубликовано 24 декабря, 2012 · Жалоба Имеется довольно большой проект для LPC1754, в котором два несмежных региона RAM. IAR 5.50.1. Одного региона для размещения всех секций .bss программы не хватает. Пытаюсь заставить линкёр размещать в два региона, но что-то не получается. Судя по документации два несмежных региона можно описать как: define region RAM_region = mem:[from 0x10000000 size 0x4000] | mem:[from 0x2007C000 size 0x4000]; и потом: place in RAM_region { rw, first block CSTACK, section .FRAM, block HEAP, section .bssStk }; Но не работает - линкёр выдаёт ошибку, что не может разместить в первую часть региона: Error[Lp015]: committed sections in [0x10000000-0x10003fff] too large to fit -- code may need too many veneers Почему он не пытается использовать вторую часть???? Если пытаться определить как 2 региона: define region RAM_regionA = mem:[from 0x10000000 size 0x4000]; define region RAM_regionB = mem:[from 0x2007C000 size 0x4000]; то при попытке направить rw-секции в разные регионы: place in RAM_regionA { rw, ... }; place in RAM_regionB { rw, ... }; Выдаётся сообщение об ошибке: Error[Lc037]: ambiguous section match: "zi section .bss in ade.o" matches more than one pattern Желания определять для каждой переменной свою отдельную секцию, отличную от .bss - нет, ибо это - криво. Надо именно - размазать секцию .bss по двум регионам. Типа как это просто и удобно делается в CCS от TI: .bss : { *(.bss) } >> DARAM1 | DARAM2 | DARAM7 Неужто в IAR об этом не подумали????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 24 декабря, 2012 Опубликовано 24 декабря, 2012 · Жалоба вообще должен класть в регионы с дырками, но часто писали о проблемах смущает про veneers Error[Lp015]: committed sections in [0x10000000-0x10003fff] too large to fit -- code may need too many veneers У вас там кодовые секции не затерялись? (рам код может быть) map файл линкер генерит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 24 декабря, 2012 Опубликовано 24 декабря, 2012 · Жалоба У вас там кодовые секции не затерялись? (рам код может быть) map файл линкер генерит? Нет RAM-кода нету. Вот как-то непонятно решилась проблема - если написать так: define region RAM_region = mem:[from 0x10000000 size 0x4000] | mem:[from 0x2007C000 size 0x4000]; place in RAM_region { rw, first block CSTACK, section .bss, section .FRAM, section .bssStk, block HEAP }; то не влазит. По map-у вижу, что он почему-то в первую часть региона пихает больше, чем в она сама есть: .bss zero 0x10006514 0x1 solve.o [1] .bss zero 0x10006515 0x1 timeout.o [1] .bss zero 0x10006516 0x1 timeout.o [1] .bss zero 0x10006517 0x1 update.o [1] - 0x10006518 0x6518 Т.е. - почему-то не продолжает .bss который как раз идёт в конце первой части в новую часть, а лепит его в первую часть с переполнением. Но если описать так: define region RAM_region = mem:[from 0x10000000 size 0x4000] | mem:[from 0x2007C000 size 0x4000]; place in RAM_region { rw, first section .bss, block CSTACK, section .FRAM, section .bssStk, block HEAP }; (.bss переместить в начало региона), то начинает нормально линковать, и .bss переносит на 2-ю часть региона: .bss zero 0x1000333c 0xc uart.o [1] .bss zero 0x10003348 0xcc uart.o [1] .bss zero 0x10003414 0x1 update.o [1] - 0x10003415 0x759 "P2", part 3 of 3: 0x3338 .bss zero 0x2007c000 0x4 ade.o [1] .bss zero 0x2007c004 0x4 ade.o [1] .bss zero 0x2007c008 0x4 ade.o [1] .bss zero 0x2007c00c 0xa14 comm.o [1] Чудеса вобщем... :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться