Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу собрать проект 'Hello Wirld !'
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Yra
Итак: работаю под linux (до недавнего времени имел дело с Keil и iAR (юзал uCOSII собранную под ними)). Перехожу под linux.
Использую кросскомпилятор
Цитата
[yra@localhost HelloWorld]$ arm-none-linux-gnueabi-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp--disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}' --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2009q1-203' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203)


Скачал freeRTOS. Конкретно заинтересовал порт под lpc2368 GCC. Бинарник с помощью прилагаемого Make- файла так и не собрался:
Цитата
error: no memory region specified for loadable section `.rel.dyn'


Нигде не нашел что это за секция `.rel.dyn' фокус с подсовывынием в ld - файл строчки
Цитата
. = ALIGN(32 / 8);
.rel.dyn : { *(.rel.dyn) } > sdram

не прокатил.

Полный текст ld - файла:
Цитата
MEMORY
{
flash : ORIGIN = 0x00000000, LENGTH = 512K
ram : ORIGIN = 0x40000000, LENGTH = 64K
usbram : ORIGIN = 0x7FD00000, LENGTH = 16K
ethram : ORIGIN = 0x7FE00000, LENGTH = 16K

sdram : ORIGIN = 0xA0000000, LENGTH = 32M
}

__stack_end__ = 0x40000000 + 64K - 4;

SECTIONS
{
. = 0;
startup : { *(.startup)} >flash

prog :
{
*(.text)
*(.rodata) /* (. rodata) => сегмент для постоянных данных */
*(.rodata*)
/* *(.glue_7) эти участки предоставляются для хранения ARM / Thumb межсетевого код. */
/* *(.glue_7t) эти участки предоставляются для хранения ARM / Thumb межсетевого код. */

} >flash

__end_of_text__ = .;

.data :
{
__data_beg__ = .;
__data_beg_src__ = __end_of_text__;
*(.data)
*(.interp) /* ХЗ что это за секция. ПОка не нашел на неё описания... */
*(.plt) /* ХЗ что это за секция. ПОка не нашел на неё описания... */
__data_end__ = .;
} >ram AT>flash

.bss :
{
__bss_beg__ = .;
*(.bss)
} >ram

/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections. */
. = ALIGN(32 / 8);
_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;

.usbram (NOLOAD):
{
__usbram_beg__ = .;
*(.dmaram)
__usbram_end__ = .;
} >usbram

.ethram (NOLOAD):
{
__ethram_beg__ = .;
*(.ethram)
__ethram_end__ = .;
} >ethram


. = ALIGN(4);
.dynsym : { *(.dynsym) } > sdram

. = ALIGN(32 / 8);
.dynamic : { *(.dynamic) } > sdram

. = ALIGN(32 / 8);
.got.plt : { *(.got.plt) } > sdram

. = ALIGN(4);
.dynstr : { *(.dynstr) } > sdram

. = ALIGN(32 / 8);
.hash : { *(.hash) } > sdram



. = ALIGN(32 / 8);
.gnu.version : { *(.gnu.version) } > sdram /* эти секции нужны для stdlib */

. = ALIGN(32 / 8);
.gnu.version_r : { *(.gnu.version_r) } > sdram /* эти секции нужны для stdlib */


. = ALIGN(32 / 8);
.rel.dyn : { *(.rel.dyn) } > sdram




. = ALIGN(4);
.ARM.exidx : { *(.ARM.exidx) } > sdram


}
. = ALIGN(32 / 8);
_end = .;

PROVIDE (end = .);

секция sdram в данном случае непринципиальна.(всё равно предполагаю через u-boot грузиться.)

Помогите пожалуйста разобраться что не так (Точн знаю, что эта секция нужна для stdlib. Подозреваю, что эта секция для определения диапазона динамически выделяемой памяти.)

Самое интересное, что u-boot у меня собирается и работает (но там make - файл слишком наворочен, а ld - файл упрощён).
Yra
Дайте хотябы ссылку на бинарники нормального gcc - компилятора (под linux) которым можно собрать freeRTOS.
AHTOXA
У вас компилятор кажись не тот. Дл freeRtos надо не
arm-none-linux-gnueabi-gcc
а
arm-none-eabi-gcc,
то есть без -linux

Цитата(Yra @ Sep 18 2009, 00:36) *
Дайте хотябы ссылку на бинарники нормального gcc - компилятора (под linux) которым можно собрать freeRTOS.


да там же, на CodeSourcery.
Yra
Хрен редьки не слаще:
Цитата
[yra@localhost RTOSDemo]$ arm-none-eabi-gcc -v
Using built-in specs.
Target: arm-none-eabi
Configured with: /scratch/maxim/arm-lite/src-4.3-arm-none-eabi-lite/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --disable-shared --with-newlib --with-pkgversion='Sourcery G++ Lite 2009q1-161' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot=/scratch/maxim/arm-lite/install-4.3-arm-none-eabi-lite/arm-none-eabi --with-gmp=/scratch/maxim/arm-lite/obj-4.3-arm-none-eabi-lite/host-libs-2009q1-161-arm-none-eabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/maxim/arm-lite/obj-4.3-arm-none-eabi-lite/host-libs-2009q1-161-arm-none-eabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/maxim/arm-lite/install-4.3-arm-none-eabi-lite/arm-none-eabi/bin --with-build-time-tools=/scratch/maxim/arm-lite/install-4.3-arm-none-eabi-lite/arm-none-eabi/bin
Thread model: single
gcc version 4.3.3 (Sourcery G++ Lite 2009q1-161)


другая проблемма:
Цитата
ortable/MemMang/heap_2.o boot.s -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text+0x20): undefined reference to `_write'
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text+0x18): undefined reference to `_close'
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text+0x1c): undefined reference to `_fstat'
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text+0x18): undefined reference to `_isatty'
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text+0x20): undefined reference to `_lseek'
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text+0x20): undefined reference to `_read'
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/libgcc.a(_divdi3.o)sad.gif.ARM.exidx+0x0): relocation truncated to fit: R_ARM_PREL31 against `.text'
/home/yra/x-tools/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/libgcc.a(_udivdi3.o)sad.gif.ARM.exidx+0x0): relocation truncated to fit: R_ARM_PREL31 against `.text'
collect2: ld returned 1 exit status
make: *** [RTOSDemo.elf] Ошибка 1


Здесь не находит функций _sbrk _write ...
Пробовал тупо в мэйкфайле в опциях компилятора указать -D MISSING_SYSCALL_NAMES \ т.к нашел файл :
Цитата
#ifndef __SYSLIST_H
#define __SYSLIST_H

#ifdef MISSING_SYSCALL_NAMES
#define _close close
#define _execve execve
#define _fcntl fcntl
#define _fork fork
#define _fstat fstat
#define _getpid getpid
#define _gettimeofday gettimeofday
#define _isatty isatty
#define _kill kill
#define _link link
#define _lseek lseek
#define _open open
#define _read read
#define _sbrk sbrk
#define _stat stat
#define _times times
#define _unlink unlink
#define _wait wait
#define _write write
#endif /* MISSING_SYSCALL_NAMES */

не помогло..
AHTOXA
Цитата(Yra @ Sep 19 2009, 02:17) *
Хрен редьки не слаще

Ну это уже мелочи. Добавьте к проекту вот это: Нажмите для просмотра прикрепленного файла

Кстати, это я взял как раз из какого-то примера под FreeRtos...
Yra
Спасибо помогло: собирается. Насчёт работает-ли?... буду дальше ковырять
Yra
Следующие осложнения: для полураскошной отладки кода нужно использовать функцию printf. Для того, чтобы эта функция печатала в последовательный порт нужно инициализировать этот порт, и создать функцию putchar типа:
Цитата
57 int putchar(int ch)
58 {
59 while((U0LSR & (1<<5)) == 0); /* Wait for empty U0THR */
60 U0THR = ch;
61 return ch;
62 }


в общем, компилятор выдайт такую ошибку:
Цитата
stf_syscalls_minimal.c:57: error: expected identifier or '(' before '--' token

Что-то в int putchar(int ch) не нрваится ему (если делаю int putchar1(int ch) - то всё нормально - это ошибка не синтаксиса). Что-то я туплю с этим gcc (в кеиле подобный фокус прокатывал без осложнений...). В u-boot вообще понамутили понамутили , но в результате printf работает. Не могу понять что они там сделали.
Копался в *.h - файлах gcc: нашел 3 файла stdio.h.
В первом из них putchar присутствует в виде:
Цитата
int _EXFUN(putchar, (int));

Во втором:
Цитата
extern int putchar (int __c);

В третьем:
Цитата
/* Write a character to stdout. */
__STDIO_INLINE int
putchar (int __c)
{
return _IO_putc (__c, stdout);
}


Я так полагаю, в зависимости от опций компилятора подключается к проекту один из этих файлов. (я конечно же не тот подключил...) интересно знать какие опции... Помогите пожалуйста
AHTOXA
В том stf_syscalls_minimal.c, который я постил, вызывается ф-я
Код
int putChar(int ch);


Вот её-то и надо определить у себя в приложении.
Заодно поищите по своим файлам слово "putChar", похоже там где-то есть какой-то противоречивый define.

На крайняк поменяйте название на putChar1 (в ф-ии _write() и там где определили).

---------
Да, и покажите командную строку и скрипт линкера. Посмотрим, какие либы подключаются.
Yra
Вот код, вызывающий функции
Код
int main( void )
{

       lowlevel_init(); // взял из u-boot
       serial_init(); // взял из u-boot

       serial_putc ('1');  //тоже самое что и putChar
       putChar('2');


printf("Hello World !!");

putChar('3');
...


Вот makefile : (я там убил thumb interwork)
Код
RTOS_SOURCE_DIR=../../../Source
DEMO_COMMON_DIR=../../Common/Minimal
DEMO_INCLUDE_DIR=../../Common/include
UIP_COMMON_DIR=../../Common/ethernet/uIP/uip-1.0/uip



#CROSS_COMPILE = arm-arm7-linux-gnu-
#CROSS_COMPILE = arm-none-linux-gnueabi-
#CROSS_COMPILE = arm-unknown-elf-
CROSS_COMPILE = arm-none-eabi-



CC=$(CROSS_COMPILE)gcc
OBJCOPY=$(CROSS_COMPILE)objcopy
LDSCRIPT=lpc2478_sdram.ld

#LINKER_FLAGS=-mthumb -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
LINKER_FLAGS= -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map



DEBUG=-g
OPTIM=-O1


CFLAGS= $(DEBUG) \
        $(OPTIM) \
        -T$(LDSCRIPT) \
        -I . \
        -I ./init \
        -I $(RTOS_SOURCE_DIR)/include \
        -I $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC23xx \
        -I $(DEMO_INCLUDE_DIR) \
        -I ./webserver \
        -I $(UIP_COMMON_DIR) \
        -D ROWLEY_LPC23xx \
        -D THUMB_INTERWORK \
        -mcpu=arm7tdmi \
        -D PACK_STRUCT_END=__attribute\(\(packed\)\) \
        -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) \
        -fomit-frame-pointer
#        -mthumb-interwork
#        -fPIC \

                                        
THUMB_SOURCE= \
        main.c \
        stf_syscalls_minimal.c \
        ./ParTest/ParTest.c \
        ./LCD/portlcd.c \
        $(DEMO_COMMON_DIR)/BlockQ.c \
        $(DEMO_COMMON_DIR)/blocktim.c \
        $(DEMO_COMMON_DIR)/flash.c \
        $(DEMO_COMMON_DIR)/integer.c \
        $(DEMO_COMMON_DIR)/GenQTest.c \
        $(DEMO_COMMON_DIR)/QPeek.c \
        $(DEMO_COMMON_DIR)/dynamic.c \
        ./webserver/uIP_Task.c \
        ./webserver/emac.c \
        ./webserver/httpd.c \
        ./webserver/httpd-cgi.c \
        ./webserver/httpd-fs.c \
        ./webserver/http-strings.c \
        $(UIP_COMMON_DIR)/uip_arp.c \
        $(UIP_COMMON_DIR)/psock.c \
        $(UIP_COMMON_DIR)/timer.c \
        $(UIP_COMMON_DIR)/uip.c \
        $(RTOS_SOURCE_DIR)/list.c \
        $(RTOS_SOURCE_DIR)/queue.c \
        $(RTOS_SOURCE_DIR)/tasks.c \
        $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC23xx/port.c \
        $(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c

ARM_SOURCE= \
        $(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC23xx/portISR.c \
        ./webserver/EMAC_ISR.c \
        ./init/lowlevel_init.c \
        ./init/irqVec.c \
        ./init/serial.c
        

THUMB_OBJS = $(THUMB_SOURCE:.c=.o)
ARM_OBJS = $(ARM_SOURCE:.c=.o)


all: RTOSDemo.bin

RTOSDemo.bin : RTOSDemo.hex
    $(OBJCOPY) RTOSDemo.elf -O binary RTOSDemo.bin
    
RTOSDemo.hex : RTOSDemo.elf
    $(OBJCOPY) RTOSDemo.elf -O ihex RTOSDemo.hex

RTOSDemo.elf : $(THUMB_OBJS) $(ARM_OBJS) boot.s Makefile
    $(CC) $(CFLAGS) $(ARM_OBJS) $(THUMB_OBJS) $(LIBS) boot.s $(LINKER_FLAGS)

#$(THUMB_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
#    $(CC) -c $(CFLAGS) -mthumb $< -o $@

$(THUMB_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
    $(CC) -c $(CFLAGS) $< -o $@

$(ARM_OBJS) : %.o : %.c Makefile FreeRTOSConfig.h
    $(CC) -c $(CFLAGS) $< -o $@

clean :
    rm $(THUMB_OBJS)
    rm $(ARM_OBJS)
    touch Makefile
    rm RTOSDemo.elf
    rm RTOSDemo.hex


вот скрипт линкера (заточен под работу из sdram )
Код
MEMORY
{
    flash     : ORIGIN = 0x00000000, LENGTH = 512K
    ram     : ORIGIN = 0x40000000, LENGTH = 64K    
    usbram   : ORIGIN = 0x7FD00000, LENGTH = 16K
    ethram   : ORIGIN = 0x7FE00000, LENGTH = 16K
    
    sdram    : ORIGIN = 0xA0000000, LENGTH = 32M
}

__stack_end__ = 0x40000000 + 64K - 4;

SECTIONS
{
    . = 0;
    startup : { *(.startup)} >sdram

    prog :
    {
        *(.text)
        *(.rodata)  /* (. rodata) => сегмент для постоянных данных */
        *(.rodata*)
        *(.glue_7)  /* эти участки предоставляются для хранения ARM / Thumb межсетевого код. */
        *(.glue_7t) /* эти участки предоставляются для хранения ARM / Thumb межсетевого код. */        
        
    } >sdram

    __end_of_text__ = .;

    .data :
    {
        __data_beg__ = .;
        __data_beg_src__ = __end_of_text__;
        *(.data)
        *(.interp) /* ХЗ что это за секция. ПОка не нашел на неё описания... */
        *(.plt)    /* ХЗ что это за секция. ПОка не нашел на неё описания... */        
        __data_end__ = .;
    } >sdram

    .bss :
    {
        __bss_beg__ = .;
        *(.bss)
    } >sdram

    /* Align here to ensure that the .bss section occupies space up to
    _end.  Align after .bss to ensure correct alignment even if the
    .bss section disappears because there are no input sections.  */
    . = ALIGN(32 / 8);
    _bss_end__ = .; __bss_end__ = .; __end__ = .;

    .usbram (NOLOAD):
    {
    __usbram_beg__ = .;
    *(.dmaram)
        __usbram_end__ = .;
    } >usbram

    .ethram (NOLOAD):
    {
    __ethram_beg__ = .;
    *(.ethram)
        __ethram_end__ = .;
    } >ethram

    . = ALIGN(32 / 8);
    .ARM.exidx : { *(.ARM.exidx) } > sdram  /* без этой строчки не линкуется */


}
    . = ALIGN(32 / 8);
    _end = .;
    
    PROVIDE (end = .);


Вот лог компиляции:
Код
[yra@localhost RTOSDemo]$ make
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer main.c -o main.o                                                                        
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer stf_syscalls_minimal.c -o stf_syscalls_minimal.o                                        
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ParTest/ParTest.c -o ParTest/ParTest.o                                                  
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer LCD/portlcd.c -o LCD/portlcd.o                                                          
LCD/portlcd.c:34:1: warning: "LCD_CTRL" redefined                                                                    
In file included from ./FreeRTOSConfig.h:52,                                                                          
                 from ../../../Source/include/FreeRTOS.h:61,                                                          
                 from LCD/portlcd.c:23:                                                                              
./LPC24xx.h:1150:1: warning: this is the location of the previous definition                                          
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/Minimal/BlockQ.c -o ../../Common/Minimal/BlockQ.o                          
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/Minimal/blocktim.c -o ../../Common/Minimal/blocktim.o                      
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/Minimal/flash.c -o ../../Common/Minimal/flash.o                            
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/Minimal/integer.c -o ../../Common/Minimal/integer.o                        
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/Minimal/GenQTest.c -o ../../Common/Minimal/GenQTest.o                      
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/Minimal/QPeek.c -o ../../Common/Minimal/QPeek.o                            
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/Minimal/dynamic.c -o ../../Common/Minimal/dynamic.o                        
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer webserver/uIP_Task.c -o webserver/uIP_Task.o                                            
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer webserver/emac.c -o webserver/emac.o                                                    
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer webserver/httpd.c -o webserver/httpd.o                                                  
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer webserver/httpd-cgi.c -o webserver/httpd-cgi.o                                          
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer webserver/httpd-fs.c -o webserver/httpd-fs.o                                            
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer webserver/http-strings.c -o webserver/http-strings.o                                    
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/ethernet/uIP/uip-1.0/uip/uip_arp.c -o ../../Common/ethernet/uIP/uip-1.0/uip/uip_arp.o                                                                                                            
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/ethernet/uIP/uip-1.0/uip/psock.c -o ../../Common/ethernet/uIP/uip-1.0/uip/psock.o                                                                                                                
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/ethernet/uIP/uip-1.0/uip/timer.c -o ../../Common/ethernet/uIP/uip-1.0/uip/timer.o                                                                                                                
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../Common/ethernet/uIP/uip-1.0/uip/uip.c -o ../../Common/ethernet/uIP/uip-1.0/uip/uip.o                                                                                                                    
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../../Source/list.c -o ../../../Source/list.o                                        
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../../Source/queue.c -o ../../../Source/queue.o                                      
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../../Source/tasks.c -o ../../../Source/tasks.o                                      
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../../Source/portable/GCC/ARM7_LPC23xx/port.c -o ../../../Source/portable/GCC/ARM7_LPC23xx/port.o                                                                                                          
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../../Source/portable/MemMang/heap_2.c -o ../../../Source/portable/MemMang/heap_2.o  
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../../Source/portable/GCC/ARM7_LPC23xx/portISR.c -o ../../../Source/portable/GCC/ARM7_LPC23xx/portISR.o
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer webserver/EMAC_ISR.c -o webserver/EMAC_ISR.o
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer init/lowlevel_init.c -o init/lowlevel_init.o
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer init/irqVec.c -o init/irqVec.o
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer init/serial.c -o init/serial.o
arm-none-eabi-gcc -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer ../../../Source/portable/GCC/ARM7_LPC23xx/portISR.o ./webserver/EMAC_ISR.o ./init/lowlevel_init.o ./init/irqVec.o ./init/serial.o main.o stf_syscalls_minimal.o ./ParTest/ParTest.o ./LCD/portlcd.o ../../Common/Minimal/BlockQ.o ../../Common/Minimal/blocktim.o ../../Common/Minimal/flash.o ../../Common/Minimal/integer.o ../../Common/Minimal/GenQTest.o ../../Common/Minimal/QPeek.o ../../Common/Minimal/dynamic.o ./webserver/uIP_Task.o ./webserver/emac.o ./webserver/httpd.o ./webserver/httpd-cgi.o ./webserver/httpd-fs.o ./webserver/http-strings.o ../../Common/ethernet/uIP/uip-1.0/uip/uip_arp.o ../../Common/ethernet/uIP/uip-1.0/uip/psock.o ../../Common/ethernet/uIP/uip-1.0/uip/timer.o ../../Common/ethernet/uIP/uip-1.0/uip/uip.o ../../../Source/list.o ../../../Source/queue.o ../../../Source/tasks.o ../../../Source/portable/GCC/ARM7_LPC23xx/port.o ../../../Source/portable/MemMang/heap_2.o  boot.s -nostartfiles -Xlinker -oRTOSDemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
arm-none-eabi-objcopy RTOSDemo.elf -O ihex RTOSDemo.hex
arm-none-eabi-objcopy RTOSDemo.elf -O binary RTOSDemo.bin
[yra@localhost RTOSDemo]$


Вот лог u-boot: заливаю по com - порту в sdram проект, запускаю на выполнение, печатается символ '1',
печатается символ '2' далее виснет на функции printf("Hello World !!"); потомучто '3' уже не печатается.
Код
**************************************************************************
*               patch to SK-LPC2478-S3E board                                             *
*      based on patch from Embedded Artists  LPC2468 OEM Board           *
**************************************************************************


U-Boot 2009.06 (�И�ю�л 23 2009 - 05:18:11)

DRAM:  32 MB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
SK-LPC2478-S3E # loady 0xa0000000
## Ready for binary (ymodem) download to 0xA0000000 at 38400 bps...
Cm - CRC mode, 949(SOH)/0(STX)/0(CAN) packets, 3 retries
## Total Size      = 0x0001d920 = 121120 Bytes
SK-LPC2478-S3E # go 0xa0000000
## Starting application at 0xA0000000 ...
12


В коде putCtar определяется только в одном месте (где я её определил)
AHTOXA
Насчёт uboot-а я не в курсах... Во всяком случае, не слышал, чтоб проект FreeRtos работал под u-boot.
arm-none-eabi-gcc делает standalone приложение, которое должно работать само по себе, безо всяких костылей. Может попробовать прошить его вместо u-boot-а?
Но если вы точно знаете, что это возможно, то копайте в сторону _sbrk(). Потому что printf вызывает malloc(), который, в свою очередь, зовёт _sbrk().
mdmitry
Цитата(AHTOXA @ Sep 23 2009, 12:22) *
Насчёт uboot-а я не в курсах... Во всяком случае, не слышал, чтоб проект FreeRtos работал под u-boot.
arm-none-eabi-gcc делает standalone приложение, которое должно работать само по себе, безо всяких костылей. Может попробовать прошить его вместо u-boot-а?

U-boot - это вторичный загрузчик (используется, например, для AT91SAM926x, y TI на ARM). Позволяет в том числе инициализировать периферию кристалла (SDRAM) и загрузить код в RAM для его выполнения. Подробности можно посмотреть на U-boot
С помощью U-boot обычно грузится linux (ядро).
AHTOXA
Цитата(mdmitry @ Sep 23 2009, 14:50) *
С помощью U-boot обычно грузится linux (ядро).

Это всё понятно. А вот как им грузить standalone приложение? Он же наверное вектора прерываний свои ставит, и ещё много чего.
Yra
Цитата
Это всё понятно. А вот как им грузить standalone приложение? Он же наверное вектора прерываний свои ставит, и ещё много чего.


u-boot, если его использовать по назначению, производит первоначальную конфигурацию системы, грузит linux, передаёт туда сведения о конфигурации системы...

В данном случае я делаю вот что: собрал проект для sdram (вектора прерываний у меня оказались по 0xa000000x адресам), с помощю u-boot (который после запуска конфигурит sdram) скопировал бинарник в память по 0xA0000000 адресу и передал управление этому бинарнику.
Далее выполняется стандартный ассемблерный код, связанный с инициализацией сегментов памяти и передача управления в main().
В функции lowlevel_init(); в том числе прописан код производящий ремаппинг векторов прерываний (у lpc24xx можно отображать в памяти вектра прерываний в нескольких местах...), тоесть копирование вектрорв в определённую область памяти (во внутреннюю) и установка соответствующих бит управления системой.
Этим же методом я ковырял код самого u-boot (проверял как работают вектора прерываний).
Linux - всего частный случай.
AHTOXA
Цитата(Yra @ Sep 23 2009, 21:18) *
Linux - всего частный случай.


Ну если так, то всё должно работатьsmile.gif

Вот ошибка:
Цитата(Yra @ Sep 23 2009, 03:03) *
вот скрипт линкера (заточен под работу из sdram )
Код
.....
     . = ALIGN(32 / 8);
     .ARM.exidx : { *(.ARM.exidx) } > sdram  /* без этой строчки не линкуется */


}
     . = ALIGN(32 / 8);
     _end = .;
    
     PROVIDE (end = .);



_end - вне всех секций. А этот символ используется в _sbrk(). Засуньте его в ram наверное:
Код
.bss :
    {
        __bss_beg__ = .;
        *(.bss)
     _end = .;
      } >ram
Yra
странно: этот кусок скрипта остался от freeRTOS- овского. Я его не менял потомучто не понял к чему это...
------
нет: как ругался на функцию
Код
int putchar(int ch)
{
  if (ch == '\n')
  {
    while((U0LSR & (1<<5)) == 0); /* Wait for empty U0THR */
    U0THR = '\r';
  }

  while((U0LSR & (1<<5)) == 0); /* Wait for empty U0THR */
  U0THR = ch;
return ch;
}

так и продолжает:
Код
[yra@localhost RTOSDemo]$ make
arm-none-eabi-gcc -c -g -O1 -Tlpc2478_sdram.ld -I . -I ./init -I ../../../Source/include -I ../../../Source/portable/GCC/ARM7_LPC23xx -I ../../Common/include -I ./webserver -I ../../Common/ethernet/uIP/uip-1.0/uip -D ROWLEY_LPC23xx -D THUMB_INTERWORK -mcpu=arm7tdmi -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -fomit-frame-pointer init/serial.c -o init/serial.o
init/serial.c:90: error: expected identifier or '(' before '--' token
make: *** [init/serial.o] Ошибка 1
[yra@localhost RTOSDemo]$




Может наведёте на примерчики простеньких программ (желательно с printf) под gcc. На сайте atmel чтото всё под кеил да под иар.. Может ещё где видели. Чтото не подворачивается ничего. Мало информации..
AHTOXA
Цитата(Yra @ Sep 23 2009, 21:48) *
странно: этот кусок скрипта остался от freeRTOS- овского. Я его не менял потомучто не понял к чему это...


Так судя по тому, что у вас в проекте не было заглушек, в нём не использовался printf? Вот поэтому и работало наверное.
end - это конец используемой памяти. Начиная с него _sbrk() начинает выдавать свободную память для malloc().

В любом случае - попробуйте, хуже не будетsmile.gif

ЗЫ. . = ALIGN(32 / 8); перед _end = .; не забудьте.


Цитата(Yra @ Sep 23 2009, 21:48) *
нет: как ругался на функцию
Код
int putchar(int ch)

так и продолжает

Так вы ж её переименовали вроде? Давайте решать проблемы по очередиsmile.gif Пусть сейчас будет putChar(), тот вариант, который скомпилировался и выдавал циферки, но где не работал printf.

Цитата
Код
init/serial.c:90: error: expected identifier or '(' before '--' token

Кстати, такие дурацкие ошибки бывают, когда в каком-нибудь инклюде нет точки с запятой. Иногда компилятор от этого клинит. Хотя тогда бы смена имени не помогала...
Цитата
Может наведёте на примерчики простеньких программ (желательно с printf) под gcc. На сайте atmel чтото всё под кеил да под иар.. Может ещё где видели. Чтото не подворачивается ничего. Мало информации..


Да у меня всё больше под stm32. Но попробую поискать.
Yra
нет. Всё тоже: 12висим
----
попробовал так:
Код
int main( void )
{
char a[100];
int i = 0;

       lowlevel_init();
       serial_init();

       serial_putc ('1');
       putChar('2');


sprintf(a, "Hello World !!");

putChar('3');

while(a[i])
  putChar(a[i++]);

putChar('4');



результат:
Код
## Starting application at 0xA0000000 ...
123Hello World !!4


некашерно. но жить уже можно. Вроде раз sprintf работает, то проблемма не в malloc
AHTOXA
Цитата(Yra @ Sep 23 2009, 22:15) *
некашерно. но жить уже можно. Вроде раз sprintf работает, то проблемма не в malloc


Далеко не факт. У него там какая-то своя хитрая логикаsmile.gif

Я тут посмотрел ещё раз, оказывается я перепутал. В _sbrk() используется не _end, а _heap!

Попробуйте добавить в конец скрипта линкерного

Код
PROVIDE( _heap = _end );


Должно задышатьsmile.gif
Yra
нет. Всё тоже: 12висим sad.gif
AHTOXA
Да, грустно. У меня закончились предположения.

Вот мой рабочий проект под stm32, я как раз разбирался с printf:
Нажмите для просмотра прикрепленного файла

Попробуйте сделать такую же отладочную выдачу как в main.c (функция show_linker_vars() ).
Ну и в _sbrk() тоже. Сразу увидите, что не так. По крайней мере, мне это помоглоsmile.gif

Да, вспомнил ещё один глюк. У меня не инициализировались инициализированные переменные в стартапе, и в результате heap был сразу не ноль, и поэтому _sbrk() не работал.

-----
А! Вспомнил что было smile.gif

Короче, этот arm-none-eabi- c ключом -fdata-sections помещает инициализированные переменные не просто в bss, а в bss.имя_переменной. А в линкерном скрипте указано просто (.bss).
Исправил на
Код
    .bss :
    {
        . = ALIGN(4);
        _sbss = .;
         *(.bss)
         *(.bss.*)
         *(COMMON)
        . = ALIGN(4);
        _ebss = .;
        _end = .;
        __end = .;
    } >RAM


Это не ваш случай, у вас нет ключа -fdata-sections, но это так, на всякий случай.
Flexz
А вам действительно newlib нужен? Если просто printf надо, так возмите какую-нибудь минимальную реализацию, которая инты да строки выводить умеет (гугль -> printf embedded).
Yra
Цитата
А вам действительно newlib нужен? Если просто printf надо, так возмите какую-нибудь минимальную реализацию, которая инты да строки выводить умеет (гугль -> printf embedded).

Не обязательно. printf нужна для вывода значений переменных в процессе отладки. Очень удобно...
alx2
Если вы действительно используете printf из newlib, то он не имеет никакого отношения к putchar. В newlib printf сделан по-честному - он эквивалентен fprintf(stdout, ...), и бэк-эндом для него является системный вызов write. Соответственно, для использования printf stdout должен содержать открытый для записи поток (newlib-овский stdout допускает прямое присваивание ему значения), а собственно вывод в последовательный порт должен выполняться внутри write.
AHTOXA
Цитата(alx2 @ Sep 27 2009, 03:27) *
Если вы действительно используете printf из newlib, то он не имеет никакого отношения к putchar. В newlib printf сделан по-честному - он эквивалентен fprintf(stdout, ...), и бэк-эндом для него является системный вызов write.


Не сбивайте человекаsmile.gif У него нет системы, потому системный вызов _write() вместе с другими необходимыми системными вызовами пришлось добавлять самому (см. мой аттач к посту №5). И в этом самодельном _write() - таки вызывается putChar().
alx2
Цитата(AHTOXA @ Sep 27 2009, 12:54) *
И в этом самодельном _write() - таки вызывается putChar().
А, прошу прощения. smile.gif Я поначалу не заметил, что это putChar, а не putchar...
demiurg_spb
Цитата(AHTOXA @ Sep 19 2009, 01:07) *
Ну это уже мелочи. Добавьте к проекту вот это: Нажмите для просмотра прикрепленного файла

Кстати, это я взял как раз из какого-то примера под FreeRtos...
ИМХО, недавно нашёл более прямой способ (при использовании newlib):
При линковке добавить -lnosys
и в скрипте линкера добавить
Цитата
PROVIDE ( end = _end );
Тогда не нужно ваш файл цеплять к проекту.

Ну и ещё очень полезным оказался ключик:
Цитата
LDFLAGS += --specs=nano.specs

Посмотрел исходники ScmRtos:
Чтобы с LTO собиралось стоит поправит стартап файл в части таблицы векторов, добавив used:
Цитата
__attribute__ ((used, section(".isr_vector")))

Хотел спросить зачем вы переименовали стандартные имена обработчиков векторов и дали им нестандартные имена?
Цитата
void PendSVC_ISR(void);
void SystemTimer_ISR(void);

Я потратил массу времени пытаясь понять почему не вызывается SysTick_Handler...
AHTOXA
Цитата(demiurg_spb @ Aug 29 2013, 14:55) *
ИМХО, недавно нашёл более прямой способ (при использовании newlib):

О, появилась реализация заглушек в тулчейне? В каком? Как там должен называться putchar()? Есть ли в _sbrk() проверка на перекрытие кучи и стека?
Цитата(demiurg_spb @ Aug 29 2013, 14:55) *
Ну и ещё очень полезным оказался ключик:

Насколько я понял, это пока не портабельно. А где можно почитать, что это даёт?
Цитата(demiurg_spb @ Aug 29 2013, 14:55) *
Чтобы с LTO собиралось стоит поправит стартап файл в части таблицы векторов, добавив used:
Хотел спросить зачем вы переименовали стандартные имена обработчиков векторов и дали им нестандартные имена?

В примерах для F2xx и F4xx это уже есть.
ЕМНИМС, имена поменял не я, а ST:) Я взял их из какого-то совсем старого ST-шного стартапа.
demiurg_spb
Цитата(AHTOXA @ Aug 29 2013, 16:03) *
О, появилась реализация заглушек в тулчейне? В каком?
4.7.4 с launchpad.net
Кстати этот тулчейн заметно быстрее собирает проекты инфа.

Цитата
Как там должен называться putchar()?
Есть ли в _sbrk() проверка на перекрытие кучи и стека?
Пока не имею ответов, но судя по форуму на ланчпаде они должны были вставить проверку.

Цитата
Насколько я понял, это пока не портабельно. А где можно почитать, что это даёт?
В доке на newlib. Использует nano реализацию newlib, у меня чуть-ли не минус 15К с проекта ушло.
Проблем с портабельностью пока не встретил.

Цитата
В примерах для F2xx и F4xx это уже есть. ЕМНИМС, имена поменял не я, а ST:) Я взял их из какого-то совсем старого ST-шного стартапа.
Понятно.
ИМХО стоит привести в соответствие с последним CMSIS'ом.
AHTOXA
Цитата(demiurg_spb @ Aug 29 2013, 18:19) *
4.7.4 с launchpad.net

gcc-arm-embedded? Понятно. Что-то у меня не получилось ничего, ругается на отсутствие _sbrk, _write, _close и проч. (Тестовый проект с printf). Версия вроде свежая:
Код
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.7.4 20130613 (release) [ARM/embedded-4_7-branch revision 200083]
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

--specs=nano.specs работает прекрасно (первая строчка без этого ключа, вторая - с ним):
Код
   text       data        bss        dec        hex    filename
  29692       2244        600      32536       7f18    ./exe/hello-stm32-printf.elf
   6720        236        552       7508       1d54    ./exe/hello-stm32-printf.elf

Осталось узнать, что мы при этом теряемsm.gif
Цитата(demiurg_spb @ Aug 29 2013, 18:19) *
Проблем с портабельностью пока не встретил.

Ну вот, например, kgp-тулчейн не знает ничего про --specs=nano.specs.
Цитата(demiurg_spb @ Aug 29 2013, 18:19) *
ИМХО стоит привести в соответствие с последним CMSIS'ом.

Зачем? Всё равно CMSIS-овский стартап не подходит, он не вызывает конструкторы. К тому же, потеряется совместимость с имеющимися проектами.
demiurg_spb
Цитата(AHTOXA @ Aug 29 2013, 23:09) *
gcc-arm-embedded? Понятно. Что-то у меня не получилось ничего, ругается на отсутствие _sbrk, _write, _close и проч. (Тестовый проект с printf). Версия вроде свежая:
Странно... У меня не ругается. Да и вы сами можете убедиться что всё это есть в либе libnosys.a.
Код
    LDFLAGS =
    LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
    LDFLAGS += -nostartfiles
    LDFLAGS += -nodefaultlibs
    LDFLAGS += --specs=nano.specs
    LDFLAGS += -Wl,--relax
    LDFLAGS += -Wl,--gc-section
    LDFLAGS += -Wl,--static
    LDFLAGS += -Wl,--start-group
    LDFLAGS += -lm -lc -lgcc -lnosys
    LDFLAGS += -Wl,--end-group
    LDFLAGS += -T$(LINKER_SCRIPT_FILE)
    LDFLAGS += -Wl,--Map=$(TARGET).map,--cref


Цитата
--specs=nano.specs работает прекрасно
Осталось узнать, что мы при этом теряемsm.gif
без
Код
    LDFLAGS += -u _printf_float
теряем возможность форматировать float.

Цитата
Ну вот, например, kgp-тулчейн не знает ничего про --specs=nano.specs.
У него видимо newlib не той системы вкряченsm.gif
Это решается его пересборкой.

Цитата
Зачем? Всё равно CMSIS-овский стартап не подходит, он не вызывает конструкторы. К тому же, потеряется совместимость с имеющимися проектами.
Дело хозяйское, но лично я бы всё-равно поменял.
AHTOXA
Ага, теперь собралось. У меня не хватало флагов -nodefaultlibs и -lc.
Хм, фигня какая-то:
Код
08001938 <_write>:
8001938:   f240 2308   movw    r3, #520   ; 0x208
800193c:   f2c2 0300   movt    r3, #8192  ; 0x2000
8001940:   2258        movs    r2, #88; 0x58
8001942:   601a        str r2, [r3, #0]
8001944:   f04f 30ff   mov.w   r0, #4294967295
8001948:   4770        bx  lr

Или я что-то не понял, или мне всё равно придётся переписывать большинство этих функцийsm.gif
(Хотя код _sbrk вроде нормальный.)
demiurg_spb
Цитата(AHTOXA @ Aug 30 2013, 12:16) *
Или я что-то не понял, или мне всё равно придётся переписывать большинство этих функцийsm.gif
Да я и сам пока не до конца воткнулся ещё. Попробовал собрать - собралось. Не тестировал ещё, т.к. резко на другую задачу перекинулся.
Но из последнего что запомнил - тут по ходу дела write настроен либо на вывод через SWO либо через RDI (про RDI я вообще не в теме ещё).
AHTOXA
Цитата(demiurg_spb @ Aug 30 2013, 14:41) *
тут по ходу дела write настроен либо на вывод через SWO либо через RDI (про RDI я вообще не в теме ещё).

Судя по коду, он пишет число 88 (ENOTSOCK) в errno, и возвращает -1. Короче, очередная заглушка, которую опять же надо переопределятьsm.gif
demiurg_spb
Цитата(AHTOXA @ Aug 30 2013, 12:47) *
Судя по коду, он пишет число 88 (ENOTSOCK) в errno, и возвращает -1. Короче, очередная заглушка, которую опять же надо переопределятьsm.gif
Ваша правда.
Ну а чтобы в RDI пошло надо линковать с -lrdimon.
+
-specs=rdimon.specs
demiurg_spb
Цитата(AHTOXA @ Aug 30 2013, 12:47) *
очередная заглушка, которую опять же надо переопределятьsm.gif
Попробовал сегодня поэкспериментировать.
Достаточно в проекте c подключенной libnosys переопределить свой _write и всё начинает работать.
По сложности уже сопоставимо с avr-gcc, где требовалось реализовать лишь putc.
AHTOXA
С одной стороны, это может сделать нашу жизнь проще, с другой - я уже привык, что все заглушки в исходниках, и я точно знаю, как они устроеныsm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.