Спасибо за ответы. Не радостные новости. У меня еще вопрос.
Прошу не пинать сильно ногами, если задаю глупые вопросы, просто до этого работал только с AVR и компилировал только IARом, а сейчас приходится переходить на ARM + GCC. Неожиданно процесс перехода оказался болезненным.
Каким образом можно заставить выполняться код программы из флэш-памяти, а переменные хранить в ОЗУ? Процессор поддерживает четыре банка памяти, причем по адресу 0x40000000 начинается флеш, по адресу 0x48000000 - начинается ОЗУ. В начале флеш памяти прошит загрузчик. Имеется набор примеров исходников от Sharp, код которых должен выполняться из ОЗУ. Сценарий линковщика выглядит следующим образом:
Код
/* bla-bla-bla */
/*
* Define the memory layout for the board
*/
SECTIONS
{
. = 0x480C0000;
/* Define a load region that resides at ram base */
.text :
{
PROVIDE(__text_start = .);
}
. = ALIGN(4);
.lr_rom :
{
sdk75401_startup.o (.text);
sdk75401_crt0.o (.text);
sdk75401_relocate.o (.text);
sdk75401_relocate_init.o (.text);
sdk75401_mem_sections.o (.text);
*(.rodata);
PROVIDE (__roend = .);
}
. = ALIGN(4);
.lr_sram :
{
* (.text);
}
. = ALIGN(4);
.data :
{
/* .data section */
PROVIDE (__data_sram_start = .);
*(.data);
/* .bss region start - execution address */
PROVIDE (__bss_sram_start = .);
*(.bss)
PROVIDE (__bss_sram_end = .);
}
. = ALIGN(4);
PROVIDE (end = .);
PROVIDE (__end = .);
}
Программа собранная таким образом нормально принимается загрузчиком и без проблем запускается из ОЗУ. Пытаюсь модифицировать сценарий следующим образом:
Код
/* bla-bla-bla */
/*
* Define the memory layout for the board
*/
SECTIONS
{
. = 0x400C0000;
/* Define a load region that resides at ram base */
.text :
{
PROVIDE(__text_start = .);
}
. = ALIGN(4);
.lr_rom :
{
sdk75401_startup.o (.text);
sdk75401_crt0.o (.text);
sdk75401_relocate.o (.text);
sdk75401_relocate_init.o (.text);
sdk75401_mem_sections.o (.text);
*(.rodata);
PROVIDE (__roend = .);
}
. = ALIGN(4);
.lr_sram :
{
* (.text);
}
/*Данные будем хранить в ОЗУ*/
. = 0x480С0000;
.data :
{
/* .data section */
PROVIDE (__data_sram_start = .);
*(.data);
/* .bss region start - execution address */
PROVIDE (__bss_sram_start = .);
*(.bss)
PROVIDE (__bss_sram_end = .);
}
. = ALIGN(4);
PROVIDE (end = .);
PROVIDE (__end = .);
}
Если попытаться отдать полученный elf загрузчику, то получаю следующее сообщение:
Код
losh> load elf
loading from stdin:
F.mh data is incorrect for > 1 program header(!)
elf file type : 0x0002
machine type: 0028 version: 1
prog start addr : 0x400c0000
num prog headers: 3
num sect headers: 19
offset : 0x2a2a2a00 disk length: 0x00000094 mem len: 0x480c0000
phyaddr: 0x8ee20000 vaddr : 0x0a0d2a03 dl addr: 0x480c0000
elf load failed.
ignoring rest of file... 69561 bytes.done
losh>
В чем может быть проблема? Объясните, что я делаю не так?
Есть в наличии также пример программы, которая ложится во флэш, но при старте копирует себя в ОЗУ и выполняется оттуда. Это мне не совсем подходит. Хотелось бы выполнять код и хранить константы именно во флеше, не вытаскивая их в ОЗУ.