ld-скрипт для lpc2292

Вопросы использования и разработки трансляторов, ассемблеров, компиляторов, линкеров, библиотекарей, парсеров, Lex, Yacc и т.п.

ld-скрипт для lpc2292

Сообщение OYTIS » 02 апр 2009, 17:59

Ситуация такая: есть стек TCP/IP, который резервирует достаточно большие участки памяти. Напр.:
Код: Выделить всё
static struct memp *memp_tab[MEMP_MAX];

И еще несколько подобных массивов. Поскольку они объявлены статическими, линкер помещает их в секцию .bss, которая, как указано в ld-скрипте, располагается в sram.
Код: Выделить всё
.bss :
  {
     _bss = . ;
     *(.bss)
     *(COMMON)
  } > sram

Результат - "region sram is full". Вопроса, собственно, два:
- можно ли секцию bss расположить во flash и чем это чревато?
- можно ли убрать static из объявления глобальных переменных и (см. выше)?
OYTIS
 
Сообщения: 76
Зарегистрирован: 22 апр 2008, 12:11

Re: ld-скрипт для lpc2292

Сообщение invaisor » 02 апр 2009, 19:41

OYTIS писал(а): Вопроса, собственно, два:
- можно ли секцию bss расположить во flash и чем это чревато?
- можно ли убрать static из объявления глобальных переменных и (см. выше)?

Если под flash'ем подразумевается 256 Кб flash памяти LPC2292, то туда записать не так просто - надо будет использовать IAP (в случае LPC2292 это обращение к функциям стандартного загрузчика в режиме thumb(режим 16 битных команд)).

Под sram, я так думаю, вы подразумеваете 16 Кб LPC2292?
На стенде SDK-2.0 дополнительно есть до 512 Кб внешней SRAM, которое можно сделать видимым по адресам 0x80000000 – 0x8007FFFF (Внешнее ОЗУ 512 Кб) через BCFG0 (я обычно инициализировал его так - 0x10002483).
Таким образом, в скрипе линкера можно секцию .bss разместить полностью во внешней SRAM.
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: ld-скрипт для lpc2292

Сообщение OYTIS » 11 апр 2009, 12:08

Код: Выделить всё
MEMORY
{
  flash (rx) : org = 0x00000000, len = 0x00040000
  sram  (rw) : org = 0x40000000, len = 0x00004000
  extsram (rw): org = 0x80000000, len = 0x00080000
}

.bss :
  {....
} >extsram


В map-файле всё нормально, но программа ведет себя несколько необычно. А именно, глобальные переменные не равны нулю по умолчанию. В принципе, можно было бы обнулить и явно, но я занимаюсь портированием чужого кода, и его там достаточно много. Кроме того, возникают сомнения в том, что я действительно пишу в статическую память.
OYTIS
 
Сообщения: 76
Зарегистрирован: 22 апр 2008, 12:11

Re: ld-скрипт для lpc2292

Сообщение invaisor » 11 апр 2009, 12:48

OYTIS писал(а):
Код: Выделить всё
MEMORY
{
  flash (rx) : org = 0x00000000, len = 0x00040000
  sram  (rw) : org = 0x40000000, len = 0x00004000
  extsram (rw): org = 0x80000000, len = 0x00080000
}

.bss :
  {....
} >extsram


В map-файле всё нормально, но программа ведет себя несколько необычно. А именно, глобальные переменные не равны нулю по умолчанию. В принципе, можно было бы обнулить и явно, но я занимаюсь портированием чужого кода, и его там достаточно много. Кроме того, возникают сомнения в том, что я действительно пишу в статическую память.

Вообще за очистку глобальных переменных перед использованием отвечаем мы. Обычно в файле инициализации (start.S) происходит обнуление .bss перед передачей управления на main.
А чтобы проверить, пишите ли вы во внешнюю память, попробуйте определить указатель, к примеру на char, по адресу типа 0x80000500, что-нибудь туда записать и считать. Способ наивный, но даст реальный результат.
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: ld-скрипт для lpc2292

Сообщение OYTIS » 11 апр 2009, 14:21

Пишется. Читается. Но не обнуляется.

Test_HTTP.map
Код: Выделить всё
0x80000804                _bss = .
..............................
0x800044dc                _ebss = .


startup.s
Код: Выделить всё
.global _bss
.global _ebss
..............................
    ldr   r0, =0
    ldr   r1, bss_start
    ldr   r2, bss_end
clear_bss:
    cmp   r1, r2
    strne r0, [r1], #4
    bne   clear_bss
...............................
bss_start:       .word    _bss
bss_end:         .word    _ebss


main.c
Код: Выделить всё
char* bss = 0x80000804;
char* tmp;
for(tmp = bss; tmp<0x80001000; tmp++)
{
    print("%x", *tmp);
}
print('\n');


На выходе - гора мусора (мусор меняется при отключении-включении питания). По-моему, это чудо =)

UPD:
Кстати, вполне предсказуемо декларации вроде
Код: Выделить всё
struct tcp_pcb *tcp_active_pcbs = NULL

никак на изначальное содержимое памяти не влияют. Помогает только явное обнуление нужных переменных в начале программы.
OYTIS
 
Сообщения: 76
Зарегистрирован: 22 апр 2008, 12:11

Re: ld-скрипт для lpc2292

Сообщение invaisor » 11 апр 2009, 14:59

OYTIS писал(а):Пишется. Читается. Но не обнуляется.

Test_HTTP.map
Код: Выделить всё
0x80000804                _bss = .
..............................
0x800044dc                _ebss = .


startup.s
Код: Выделить всё
.global _bss
.global _ebss
..............................
    ldr   r0, =0
    ldr   r1, bss_start
    ldr   r2, bss_end
clear_bss:
    cmp   r1, r2
    strne r0, [r1], #4
    bne   clear_bss
...............................
bss_start:       .word    _bss
bss_end:         .word    _ebss


main.c
Код: Выделить всё
char* bss = 0x80000804;
char* tmp;
for(tmp = bss; tmp<0x80001000; tmp++)
{
    print("%x", *tmp);
}
print('\n');


На выходе - гора мусора (мусор меняется при отключении-включении питания). По-моему, это чудо =)


Совсем забыл спросить - а инициализацию использования внешней памяти (BCFG0, PINSELECT) у вас идет до обнуления bss в start.s?
Т.е. в start.s -
Код: Выделить всё
.......................................
Инициализация внешней памяти
.......................................
Обнуление bss
.......................................

Если нет, тогда, к сожалению, это не чудо :smile: Просто к тому моменту по этим адресам воопще ничего нет.
Аватара пользователя
invaisor
 
Сообщения: 227
Зарегистрирован: 08 апр 2008, 16:08

Re: ld-скрипт для lpc2292

Сообщение OYTIS » 11 апр 2009, 15:40

Точно! BCFG задавались в startup.s до обнуления памяти, а вот PINSEL - только в функции init_pio(), которая вызывалась из main. Спасибо, теперь буду начинать утро с медитации на принципиальную схему =)
OYTIS
 
Сообщения: 76
Зарегистрирован: 22 апр 2008, 12:11


Вернуться в Компиляторы и линкеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron