Собственно задача: имеется ubuntu, кросскомпилятор arm-linux-gcc 2.95.3 (ну я думаю это не столь важно), нормально компилирующийся этим кросскомпилятором проект romboot (запускается первым на плате, копирует секции из SPI-флеш в SDRAM, предварительно их инициализировав).
Скрипты для сборки:
compile:
CODE
#!/bin/sh
OUTPUT1=romboot1
CROSS=/usr/local/arm/2.95.3/bin/arm-linux-
#/usr/local/arm/<version>/bin
#CROSS=/opt/cross/bin/arm-linux-
#GCC="$CROSS"gcc
GCC="$CROSS"gcc
LD="$CROSS"ld
OBJCOPY="$CROSS"objcopy
SIZE="$CROSS"size
OBJDUMP="$CROSS"objdump
LDFLAGS="-T elf32-littlearm.lds -Ttext 0"
$GCC asm_isr.S -c -Iinclude
$GCC cstartup_ram.S -c -Iinclude
$GCC jump.S -c -Iinclude
$GCC at45.cpp -c -Iinclude -Os
$GCC com.cpp -c -Iinclude -Os
$GCC dataflash.cpp -c -Iinclude -Os
$GCC init.cpp -c -Iinclude -Os
$GCC main.cpp -c -Iinclude -Os
$GCC -c stdio.cpp -Os
$GCC -c _udivsi3.S
$GCC -c _umodsi3.S
$GCC -c div0.c -Os
$LD cstartup_ram.o asm_isr.o jump.o at45.o com.o dataflash.o init.o main.o stdio.o _udivsi3.o _umodsi3.o div0.o -o $OUTPUT1.out $LDFLAGS -n
$OBJCOPY $OUTPUT1.out -O binary $OUTPUT1.bin
$OBJDUMP -h -s $OUTPUT1.out > $OUTPUT1.lss
$SIZE $OUTPUT1.out
elf32-littlearm.lds
CODE
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text : { *(.text) }
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.bss : { *(.bss) }
}
Необходимо запустить этот (хотя бы) проект (для определённости назовём его romboot2) после небольшого увеличения функционала этим же romboot-ом (соответственно romboot1), но по адресу 0x20000000 (План: 1. Пуск romboot1 (он копирует romboot2 в SDRAM и запускает его на выполнение. 2. Работа romboot2).
Как я написал romboot1 нормально собирается. Для сборки romboot2 правлю elf32-littlearm.lds:
CODE
/* link.ld - GNU ld script */
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /* */
OUTPUT_ARCH(arm);
ENTRY(_start); /* точка входа программы */
MEMORY
{
ram : ORIGIN = 0x20000000, LENGTH = 0x8000
}
SECTIONS /* куда какую информацию размещать */
{
. = ALIGN(4);
.text : /* размещение самой программы (исполняемый код) */
{
. = ALIGN(4); /* оператор точка определяет текущий адрес, оператор ALIGN(4) –
предписываем компоновщику выравнивать адреса по 4 байта */
KEEP(*(.RESET)) /* таблица векторов прерывания в начале памяти, KEEP */
*(.text*) /* исполняемый код */
*(.rodata*) /* константы */
*(.glue_7)
*(.glue_7t)
} > ram
_etext = .;
. = ALIGN(4);
.data : /* размещение ненулевых данных */
{
_data = .;
*(.data*)
_edata = .;
} > ram
. = ALIGN(4);
.bss :
{
_bss = .;
*(.bss*)
_ebss = .;
} > ram
_stack_size = 500;
_stack_top = 0x20000000 + 0x8000;
_stack_begin = _stack_top - _stack_size;
. = ALIGN(4);
. = _stack_begin;
._stack :
{
. = . + _stack_size;
} > ram
}
В ИАРе всё просто изменяется (в файле *.icf):
Код
define symbol __ICFEDIT_intvec_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000080;
define symbol __ICFEDIT_region_RAM_end__ = 0x20008000;
Здесь же получаю:
Код
anton@ANTON:~/Рабочий стол/3_new_Xmodem_on_USART1/3$ sh compile_except
/usr/local/arm/2.95.3/bin/arm-linux-ld: address 0xa0 of romboot1.out section .text is not within region ram
/usr/local/arm/2.95.3/bin/arm-linux-objcopy: romboot1.out: ??? ?????? ????? ??? ????????
/usr/local/arm/2.95.3/bin/arm-linux-objdump: romboot1.out: ??? ?????? ????? ??? ????????
/usr/local/arm/2.95.3/bin/arm-linux-objdump: romboot1.out: ??? ?????? ????? ??? ????????
/usr/local/arm/2.95.3/bin/arm-linux-size: romboot1.out: ??? ?????? ????? ??? ????????
Пробовал разными способами указать, что адрес начала программы на целевой платформе будет не 0x0, а любой другой. В лучшем случае получался файл размером 512 Мб, в худшем описанная выше ошибка (хотя она похожа на то, что программа не убирается, но я-то её ещё вообще не трогал. как работала нормально в случае romboo1 на 16кБ внутренней SRAM, также и должна работать в SDRAM(её-то 16 Мб)). Видимо я как-то неправильно в принципе делаю. Пять дней бьюсь-->результат нулевой. Голова уже не работает. Возможно ошибка во флагах для сборки проекта romboot2, но как-то в это не вериться: как правильно указать линкеру адреса VMA не найду никак.