реклама на сайте
подробности

 
 
> Как правильно создавать standalone проекты (AT91RM9200), проблемы с кросскомпилятором под linux
Antokha
сообщение Jun 28 2011, 19:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-10-08
Из: Нижний Новгород
Пользователь №: 41 078



Собственно задача: имеется 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 не найду никак.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01357 секунд с 7
ELECTRONIX ©2004-2016