Перейти к содержанию
    

Сдаётся мне, что нет:)

Моё предположение ....

 

Наверное достоверно на этот вопрос только klen сможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у меня всё равно не работает ассемблер!

Вот что выдаёт:

Assembling: Startup/startup_stm32f10x_md.S

arm-kgp-eabi-g++ -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -x assembler-with-cpp -D VECT_TAB_RAM -Wa,-adhlns=List/startup_stm32f10x_md.lst,--gdwarf-2 Startup/startup_stm32f10x_md.S -o obj/startup_stm32f10x_md.o

make: *** [startup/startup_stm32f10x_md.o] Error 1

 

При этом версия kgp_arm_eabi_20091127 всё ест спокойно без возмущения

Assembling: Startup/startup_stm32f10x_md.S

arm-kgp-eabi-g++ -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -x assembler-with-cpp -D VECT_TAB_RAM -Wa,-adhlns=List/startup_stm32f10x_md.lst,--gdwarf-2 Startup/startup_stm32f10x_md.S -o obj/startup_stm32f10x_md.o

 

Просто заменяю в директории WinARM файлы из одного или другого архива. С проектом и исходниками при этом ничего не делаю!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2_AHTOXA

Вы правы, под мелкоармами я понимаю то что называют "микроконтроллеры" - тоесть то где нет MMU, из того что я знаю это микрухи с флеш и озу в нутрях на arm7tdmi и cortex-m3. нада сказать что дело не вкомпиллере - он под любой cpu сможет генерить, дело в библиотеках и ld который нужный формат бинаря выдает.

 

2_inco

Вы совершенно правы - еще косяг выщемил. забыл еще одну библу в дистрибутиив положить. в атаче зажатая архиватором 7z библы libgcc_s_dw2-1.dll и libgfortran-3.dll

киньте в bin, все должно заработать.

у меня

arm-kgp-eabi-g++ -c -mthumb -mcpu=cortex-m3 -mthumb-interwork -I. -x assembler-with-cpp -D VECT_TAB_RAM -Wa,-adhlns=List/startup_stm32f10x_md.lst,--gdwarf-2 Startup/startup_stm32f10x_md.S -o obj/startup_stm32f10x_md.o

нормально генерить асм. посмотрел filemon'ом - грузится libgcc_s_dw2-1.dll которую заюыл положить

 

 

извиняюсь. издержки експеремента по переходу со статической на сборку с дллэлками - это должно снизить размер дистрибутива. не критично при современных скоростях интернета но давно хотел для красоты сделать. вот и вылазит что чтото забыл положить.

 

во втором архиве еще libgfortran-3.dll, не проверял, пока допишите в bin если на фортране компиляееть собираетесь

libgcc_s_dw2_1.7z

bin.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

За свовременно выложенную dll спасибо.

 

А что делать вот с этим:

 

c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: error: no memory region specified for loadable section `.ARM.exidx.text.__gnu_ldivmod_helper'

 

В смысле, какой паттерн описать чтобы всё подобное попало куда надо?

Мой скрипт выглядит так:

SEARCH_DIR(.)

/*
* Define stack size here
*/
FIQ_STACK_SIZE = 0x0100;
IRQ_STACK_SIZE = 0x0100;
ABT_STACK_SIZE = 0x0100;
UND_STACK_SIZE = 0x0100;
SVC_STACK_SIZE = 0x0400;


MEMORY
{
 rom : org = 0x00100000, len = 64k
 ram : org = 0x00200000, len = 16k
}

/*
* Do not change the next code
*/
SECTIONS
{
 .text :
 {
*(.vectors);
. = ALIGN(4);
*(.init);
. = ALIGN(4);
*(.text.*);
. = ALIGN(4);
*(.rodata);
. = ALIGN(4);
*(.rodata*);
. = ALIGN(4);
*(.glue_7t);
. = ALIGN(4);
*(.glue_7);
/*
. = ALIGN(4);
 KEEP (*(.eh_frame))
*/
. = ALIGN(4);
etext = .;
 } > rom

 .data : AT (ADDR (.text) + SIZEOF (.text))
 {
PROVIDE (__data_start = .);
*(.ramfunc)
. = ALIGN(4);
*(.data)
. = ALIGN(4);
edata = .;
_edata = .;
PROVIDE (__data_end = .);
 } > ram

 .bss :
 {
PROVIDE (__bss_start = .);
*(.bss)
*(COMMON)
. = ALIGN(4);
PROVIDE (__bss_end = .);

. = ALIGN(256);

PROVIDE (__stack_start = .);

PROVIDE (__stack_fiq_start = .);
. += FIQ_STACK_SIZE;
. = ALIGN(4);
PROVIDE (__stack_fiq_end = .);

PROVIDE (__stack_irq_start = .);
. += IRQ_STACK_SIZE;
. = ALIGN(4);
PROVIDE (__stack_irq_end = .);

PROVIDE (__stack_abt_start = .);
. += ABT_STACK_SIZE;
. = ALIGN(4);
PROVIDE (__stack_abt_end = .);

PROVIDE (__stack_und_start = .);
. += UND_STACK_SIZE;
. = ALIGN(4);
PROVIDE (__stack_und_end = .);

PROVIDE (__stack_svc_start = .);
. += SVC_STACK_SIZE;
. = ALIGN(4);
PROVIDE (__stack_svc_end = .);
PROVIDE (__stack_end = .);
PROVIDE (__heap_start = .);   
 } > ram

/DISCARD/ :
{
	*(.eh_frame_hdr)
	*(.eh_frame)
}

}

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какой паттерн описать чтобы всё подобное попало куда надо?

 

Вставьте

    __exidx_start = .;
    .ARM.exidx :
    {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    } >rom

 

куда-нибудь после glue_7t, но до etext.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А эту куда?

 

.ARM.extab.text.unwind_phase2_forced

 

Описывал всё подряд... получил

 

c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: .text has both ordered [`.ARM.exidx.text.__gnu_ldivmod_helper' in c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0\libgcc.a(bpabi.o)] and unordered [`.ARM.extab.text.__gnu_ldivmod_helper' in c:/kgp_arm_eabi/bin/../lib/

gcc/arm-kgp-eabi/4.5.0\libgcc.a(bpabi.o)] sections

c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: final link failed: Bad value

collect2: ld returned 1 exit status

 

Есть у компилятора ключи чтобы не клал все функции в отдельные сеции?

Или в каком порядке и где должны быть .ARM.extab.text.* и .ARM.exidx.text.*

 

И ещё - надо ли ставить точку перед звёздочкой (в смысле - включать ли точку в шаблон) всяких имён секций .bss.*, .data.* и .text.* - что ещё можно встретить?

 

ps: до этого исользовал сборку yagarto - решл попробовать...

 

зы2: в конце теперь так

c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: .text has both

ordered [`.ARM.exidx.text.__gnu_ldivmod_helper' in c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0\l

ibgcc.a(bpabi.o)] and unordered [`.rodata._global_impure_ptr' in c:/kgp_arm_eabi/bin/../lib/gcc/arm-kg

p-eabi/4.5.0/../../../../arm-kgp-eabi/lib\libc.a(lib_a-impure.o)] sections

c:/kgp_arm_eabi/bin/../lib/gcc/arm-kgp-eabi/4.5.0/../../../../arm-kgp-eabi/bin/ld.exe: final link fail

ed: Bad value

 

АНТОХА, можете свой скрипт работающий с KGP выложить?

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А эту куда?

.ARM.extab.text.unwind_phase2_forced

 

А эту просто в текст:

    .text :
    {
        __ctors_start__ = .;
        KEEP(SORT(*)(.ctors))
        __ctors_end__ = .;
        __dtors_start__ = .;
        __dtors_end__ = .;
        
        . = ALIGN(4);
        *(.text)                   /* remaining code */
        *(.text.*)                   /* remaining code */
        *(.rodata)                 /* read-only data (constants) */
        *(.rodata*)

        *(.eh_frame_hdr)
        *(.eh_frame)
        *(.ARM.extab* .gnu.linkonce.armextab.*)
        *(.gcc_except_table)
        *(.eh_frame_hdr)
        *(.eh_frame)

        *(.glue_7)
        *(.glue_7t)
        . = ALIGN(4);
    } >rom

    __exidx_start = .;
    .ARM.exidx :
    {
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    } >rom

    __exidx_end = .;
    .text.align :
    {
        . = ALIGN(8);
        _etext = .;
        _sidata = _etext;
    } >rom

    .data  : AT ( _sidata )
...

 

Есть у компилятора ключи чтобы не клал все функции в отдельные сеции?

 

Для этих - вряд ли, это какие-то специальные секции.

 

И ещё - надо ли ставить точку перед звёздочкой (в смысле - включать ли точку в шаблон) всяких имён секций .bss.*, .data.* и .text.* - что ещё можно встретить?

 

Вот bss:

    .bss :
    {
        . = ALIGN(4);
        _sbss = .; /* Used by the startup in order to initialize the .bss section */
         *(.bss)
         *(.bss.*)
         *(COMMON)
        . = ALIGN(4);
        _ebss = .; /* Used by the startup in order to initialize the .bss section */
        _end = .;
        __end = .;
    } >RAM

 

ps: до этого исользовал сборку yagarto - решл попробовать...

 

Ягарто старое совсем. Лучше CodeSourcery Sourcery G++ Lite, а ещё лучше - сборки klen-а:)

Рабочие варианты скриптов для этих двух сборок можно посмотреть здесь. Там для кортексов, но не суть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это у меня для кортекса работает

/*ENTRY(Reset_Handler)*/
OUTPUT_FORMAT ("elf32-littlearm")

MEMORY
{
  flash   (rx)  : ORIGIN = 0x08000000, LENGTH = 256K
  ram    (rwx)  : ORIGIN = 0x20000000, LENGTH = 64K
}

/* define a global symbol _stack_end  */
_stack_end_ = 0x2000ffff;


/* now define the output sections  */
SECTIONS 
{
    . = 0;                                /* set location counter to address zero  */

    .text :                                /* collect all sections that should go into FLASH after startup  */ 
    {
        . = ALIGN(4);
        KEEP(*(.flash_vec_table))
        *(.text)
        *(.text*)                        /* all .text sections (code)  */
        *(.rodata)                        /* all .rodata sections (constants, strings, etc.)  */
        *(.rodata*)                        /* all .rodata* sections (constants, strings, etc.)  */
        *(.glue_7)                        /* all .glue_7 sections  (no idea what these are) */
        *(.glue_7t)                        /* all .glue_7t sections (no idea what these are) */
        *(.gnu*)
        *(.gcc*)
        . = ALIGN(4);
        _text_end_ = .;                    /* define a global symbol _etext just after the last code byte */
    } >flash                            /* put all the above into FLASH */

   
    _ram_vec_load_start_ = _text_end_;
    .ram_vec :                                 
    {
        . = ALIGN(4);
        _ram_vec_start_ = .;                
        KEEP(*(.ram_vec))
        _ram_vec_end_ = ALIGN( . , 4);                    
    }  >ram    AT> flash
     _ram_vec_load_end_ = _ram_vec_load_start_ + SIZEOF(.ram_vec);                

   _data_load_start_ = _ram_vec_load_end_;
   .data :                                /* collect all initialized .data sections that go into RAM  */ 
    {
        . = ALIGN(4);
        _data_start_ = .;                        /* create a global symbol marking the start of the .data section  */
        *(.data)                        /* all .data sections  */
        *(.data*)
        _data_end_ = ALIGN( . , 4);                            /* define a global symbol marking the end of the .data section  */
    } >ram AT >flash                    /* put all the above into RAM (but load the LMA copy into FLASH) */
  _data_load_end_ = _data_load_start_ +  SIZEOF(.data);    
   
   _fast_load_start_ = _data_load_end_;
   .fast :
   {
     . = ALIGN(4);
     _fast_start_ = .;
     *(.fast)
     *(.fast*)
     _fast_end_ = ALIGN( . , 4);
   } >ram AT >flash
   _fast_load_end_ = _fast_load_start_ +  SIZEOF(.fast);
   _flash_end_ = _fast_load_end_;
    
    
    .bss :    
    {
        . = ALIGN(4);
        _bss_start_ = .;
        *(.bss)                    
        *(.bss*)
        _bss_end_ = .;
    } >ram    

   DISCARD :
    {
     libc.a ( * )
     libm.a ( * )
     libgcc.a ( * )
     }    
    
    /* Stabs debugging sections.  */
    .stab          0 : { *(.stab) }
    .stabstr       0 : { *(.stabstr) }
    .stab.excl     0 : { *(.stab.excl) }
    .stab.exclstr  0 : { *(.stab.exclstr) }
    .stab.index    0 : { *(.stab.index) }
    .stab.indexstr 0 : { *(.stab.indexstr) }
    .comment       0 : { *(.comment) }
    /* DWARF debug sections.
       Symbols in the DWARF debugging sections are relative to the beginning
       of the section so we begin them at 0.  */
    /* DWARF 1 */
    .debug          0 : { *(.debug) }
    .line           0 : { *(.line) }
    /* GNU DWARF 1 extensions */
    .debug_srcinfo  0 : { *(.debug_srcinfo) }
    .debug_sfnames  0 : { *(.debug_sfnames) }
    /* DWARF 1.1 and DWARF 2 */
    .debug_aranges  0 : { *(.debug_aranges) }
    .debug_pubnames 0 : { *(.debug_pubnames) }
    /* DWARF 2 */
    .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
    .debug_abbrev   0 : { *(.debug_abbrev) }
    .debug_line     0 : { *(.debug_line) }
    .debug_frame    0 : { *(.debug_frame) }
    .debug_str      0 : { *(.debug_str) }
    .debug_loc      0 : { *(.debug_loc) }
    .debug_macinfo  0 : { *(.debug_macinfo) }
    /* SGI/MIPS DWARF 2 extensions */
    .debug_weaknames 0 : { *(.debug_weaknames) }
    .debug_funcnames 0 : { *(.debug_funcnames) }
    .debug_typenames 0 : { *(.debug_typenames) }
    .debug_varnames  0 : { *(.debug_varnames) }
      
}

 

это у меня для arm7tdmi, подянял старый проект персобрал свежаком.. тут вообще примитивный скрипт. собирается. попробуйте ...мож получится, тока карту памяти измените под себя

/* identify the Entry Point  */
/*ENTRY(_vectors)*/


/* specify the LPC2148 memory areas  */
MEMORY 
{
    flash                 : ORIGIN = 0,          LENGTH = 512K    /* FLASH ROM                                */    
    ram_vec             : ORIGIN = 0x40000000, LENGTH = 64      /* vec table in RAM                         */
    ram_isp_low(A)        : ORIGIN = 0x40000120, LENGTH = 223        /* variables used by Philips ISP bootloader    */         
    ram                   : ORIGIN = 0x40000200, LENGTH = 32513   /* free RAM area                            */
    ram_isp_high(A)        : ORIGIN = 0x40007FE0, LENGTH = 32        /* variables used by Philips ISP bootloader    */
    ram_usb_dma            : ORIGIN = 0x7FD00000, LENGTH = 8192    /* on-chip USB DMA RAM area (not used)      */
}


/* define a global symbol _stack_end  */
_stack_end = 0x40007EDC;



/* now define the output sections  */
SECTIONS 
{
    . = 0;                                /* set location counter to address zero  */
    
    _vec_load_start_ = .;
    .vec : 
    { 
     KEEP(*(.vec*))
    } >flash        /* the startup code goes into FLASH */
    _vec_load_end_ =  _vec_load_start_  + SIZEOF(.vec);
    
    

    .text :                                /* collect all sections that should go into FLASH after startup  */ 
    {
        *(.text*)                        /* all .text sections (code)  */
        *(.rodata*)                        /* all .rodata* sections (constants, strings, etc.)  */
        *(.glue_7)                        /* all .glue_7 sections  (no idea what these are) */
        *(.glue_7t)                        /* all .glue_7t sections (no idea what these are) */
        _text_end = .;                    /* define a global symbol _etext just after the last code byte */
    } >flash                            /* put all the above into FLASH */
    
   .fast_vec :
   {
     _fast_vec_start_ = .;
     _fast_vec_end_ =  _fast_vec_start_ + SIZEOF(.vec);
   } >ram_vec 
   
   
   _fast_load_start_ = ALIGN ( _text_end , 4 );
   .fast :
   {
     _fast_start_ = .;
     *(.fast)
     _fast_end_ = .;
   } >ram AT >flash
   _fast_load_end = _fast_load_start_ + SIZEOF(.fast);
    
   _data_load_start_ = ALIGN ( _fast_load_end , 4 );
    .data :                                /* collect all initialized .data sections that go into RAM  */ 
    {
        _data_start_ = .;                        /* create a global symbol marking the start of the .data section  */
        *(.data)                        /* all .data sections  */
        _data_end_ = .;                        /* define a global symbol marking the end of the .data section  */
    } >ram AT >flash                    /* put all the above into RAM (but load the LMA copy into FLASH) */
   _data_load_end_ = _data_load_start_ + SIZEOF(.data);
   
  

    .bss :                                /* collect all uninitialized .bss sections that go into RAM  */
    {
        _bss_start = .;                    /* define a global symbol marking the start of the .bss section */
        *(.bss)                            /* all .bss sections  */
    } >ram                                /* put all the above in RAM (it will be cleared in the startup code */

    . = ALIGN(4);                        /* advance location counter to the next 32-bit boundary */
    _bss_end = .;                        /* define a global symbol marking the end of the .bss section */
    


}
    _end = .;                            /* define a global symbol marking the end of application RAM */

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчёт ягарто... обновлялся в декабре 2009-го года.

C:\user\dds2\TC1\at91sam7s>arm-elf-gcc --version

arm-elf-gcc.EXE (GCC) 4.4.2

 

Ваш скрипт попробую применить - на работающем проекте (arm7tdmi, AT91SAM7Sxxx).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже, я нарвался на какой-то старый баг:

http://www.mail-archive.com/[email protected]/msg01065.html

 

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

 

Проект в аттачменте, в каталоге at91sam7s находится Makefile. В нём прописан путь к месту, где находится "свежак KGP". Кто-нибудь может понять, почему этот комплект не собирает?

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-нибудь может понять, почему этот комплект не собирает?

 

Потому что вы сделали не так, как я писал:)

 

Вот, поправил: sam7x64_rom.zip

 

(Обратите внимание, что откуда-то подтягивается вызов malloc.)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что вы сделали не так, как я писал:)

 

Вот, поправил: sam7x64_rom.zip

 

(Обратите внимание, что откуда-то подтягивается вызов malloc.)

 

всё начинается с откуда-то взявшегося unwind-arm.o. В варианте kgp.

В моём я перевёл в discard eh_frame*, убралось десять килобайт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так заработало?

 

С этими секциями да, много непонятного. И самое непонятное - где взять инфу о том, что это за секции:)

 

ЗЫ. Мои старые варианты линкерных скриптов для kgp перестали работать. Насколько я понял, конструкторы переехали из .ctors в .init_array.

 

всё начинается с откуда-то взявшегося unwind-arm.o. В варианте kgp.

В моём я перевёл в discard eh_frame*, убралось десять килобайт.

 

Есть более правильный вариант: sys.zip

 

Добавьте этот файл к проекту, и ничего не придётся дискардить:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так заработало?

Собранное kgp при объёме 46 килобайт работает. С этимже скриптом yagarto даёт имедж размером 36 килобайт. Вернуть на место discard - опят 30.5 килобайт.

 

sys.zip - это заплата, спсибо, но я не стал бы её использовать. Я не хотел бы терять контроля над кодом, дабы избежать непредсказуемого поведения в embedded приложении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...