ARM Initialization Question

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Sep 15 12:02:07 UTC 2008


Joel Sherrill wrote:
> Sebastian Huber wrote:
>> Hi,
>> I am quite new to the ARM architecture and try to develop a BSP for the
>> LPC2478.  I have a question to the initialization code (random start.S):
>>
>>   
> Just firing a warning shot .. I am starting to refactor out
> more common code from the BSPs.  Please try to help out
> by moving with me to the better place. :)
> 
> + You know about bsp_get_work_area.  I am starting to
>     put it in "startup/bspgetworkarea.c" not bspstart.c
>     and reworking all BSPs to have one.
[...]

I try to provide two general purpose linker command files (one for RAM 
only and one for code in ROM).  With such a linker command file it is 
possible to use a generic version of bsp_get_work_area().  Reducing the 
amount of linker command files increases the maintainablity and makes 
development of new BSPs easier.  Here is my proposal for the ARM:

/**
  * @file
  *
  * @brief Linker command file for configuration with internal and 
external RAM.
  */

/*
  * Copyright (c) 2008
  * Embedded Brains GmbH
  * Obere Lagerstr. 30
  * D-82178 Puchheim
  * Germany
  * rtems at embedded-brains.de
  *
  * The license and distribution terms for this file may be found in the 
file
  * LICENSE in this distribution or at http://www.rtems.com/license/LICENSE.
  */

OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")

OUTPUT_ARCH (arm)

ENTRY (start)

/*
  * BSP: Symbols that may be defined externally.  The minimum alignment
  * requirement for regions is bsp_section_align.
  */
bsp_ram_int_size = DEFINED (bsp_ram_int_size) ? bsp_ram_int_size : 
LENGTH (RAM_INT);

bsp_ram_ext_size = DEFINED (bsp_ram_ext_size) ? bsp_ram_ext_size : 
LENGTH (RAM_EXT);

bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 
128;

bsp_stack_fiq_size = DEFINED (bsp_stack_fiq_size) ? bsp_stack_fiq_size : 
128;

bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 
256;

bsp_stack_svc_size = DEFINED (bsp_stack_svc_size) ? bsp_stack_svc_size : 
256;

bsp_stack_undef_size = DEFINED (bsp_stack_undef_size) ? 
bsp_stack_undef_size : 128;

/*
  * BSP: Global symbols
  */
bsp_ram_int_start = ORIGIN (RAM_INT);
bsp_ram_int_end = bsp_ram_int_start + bsp_ram_int_size;

bsp_ram_ext_start = ORIGIN (RAM_EXT);
bsp_ram_ext_end = bsp_ram_ext_start + bsp_ram_ext_size;

bsp_section_align = 16;

bsp_stack_align = 16;

SECTIONS {
   .vector : {
     /*
      * BSP: Start of vector section
      */
     bsp_section_vector_start = .;

     /*
      * BSP: Reserve space for the exception vector table and
      * the pointers to the default exceptions handlers.
      */
     . = . + 64;

     . = ALIGN (bsp_section_align);

     /*
      * BSP: End of vector section
      */
     bsp_section_vector_end = .;
   } > RAM_INT

   .text : {
     /*
      * BSP: Start of text section
      */
     bsp_section_text_start = .;

     /*
      * BSP: System startup entry
      */
     KEEP (*(.entry))

     /*
      * BSP: Moved into .text from .init
      */
     KEEP (*(.init))

     *(.text .stub .text.* .gnu.linkonce.t.*)
     KEEP (*(.text.*personality*))
     /* .gnu.warning sections are handled specially by elf32.em.  */
     *(.gnu.warning)

     /*
      * BSP: Magic ARM stuff
      */
     *(.ARM.*)
     *(.glue_7)
     *(.glue_7t)
     *(.vfp11_veneer)

     /*
      * BSP: Special FreeBSD sysctl sections
      */
     . = ALIGN (16);
     __start_set_sysctl_set = .;
     *(set_sysctl_*);
     __stop_set_sysctl_set = ABSOLUTE(.);
     *(set_domain_*);
     *(set_pseudo_*);

     /*
      * BSP: Moved into .text from .*
      */
     *(.rodata .rodata.* .gnu.linkonce.r.*)
     *(.rodata1)
     *(.eh_frame_hdr)

     /*
      * BSP: Required by cpukit/score/src/threadhandler.c
      */
     PROVIDE (_fini = .);

     /*
      * BSP: Moved into .text from .fini
      */
     KEEP (*(.fini))

     . = ALIGN (bsp_section_align);

     /*
      * BSP: End of text section
      */
     bsp_section_text_end = .;
   } > RAM_EXT

   .data : {
     /*
      * BSP: Start of data section
      */
     bsp_section_data_start = .;

     /*
      * BSP: Moved into .data from .ctors
      */
     /* gcc uses crtbegin.o to find the start of
        the constructors, so we make sure it is
        first.  Because this is a wildcard, it
        doesn't matter if the user does not
        actually link against crtbegin.o; the
        linker won't look for a file to match a
        wildcard.  The wildcard also means that it
        doesn't matter which directory crtbegin.o
        is in.  */
     KEEP (*crtbegin.o(.ctors))
     KEEP (*crtbegin?.o(.ctors))
     /* We don't want to include the .ctor section from
        the crtend.o file until after the sorted ctors.
        The .ctor section from the crtend file contains the
        end of ctors marker and it must be last */
     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
     KEEP (*(SORT(.ctors.*)))
     KEEP (*(.ctors))

     /*
      * BSP: Moved into .data from .dtors
      */
     KEEP (*crtbegin.o(.dtors))
     KEEP (*crtbegin?.o(.dtors))
     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
     KEEP (*(SORT(.dtors.*)))
     KEEP (*(.dtors))

     /*
      * BSP: Moved into .data from .*
      */
     *(.data1)
     KEEP (*(.eh_frame))
     *(.gcc_except_table .gcc_except_table.*)
     KEEP (*(.jcr))

     *(.data .data.* .gnu.linkonce.d.*)
     KEEP (*(.gnu.linkonce.d.*personality*))
     SORT(CONSTRUCTORS)

     . = ALIGN (bsp_section_align);

     /*
      * BSP: End of data section
      */
     bsp_section_data_end = .;
   } > RAM_EXT

   .bss : {
     /*
      * BSP: Start of bss section
      */
     bsp_section_bss_start = .;

     *(COMMON)
     *(.dynbss)
     *(.bss .bss.* .gnu.linkonce.b.*)

     . = ALIGN (bsp_section_align);

     /*
      * BSP: End of bss section
      */
     bsp_section_bss_end = .;
   } > RAM_EXT

   .stack : {
     /*
      * BSP: Start of stack section
      */
     bsp_section_stack_start = .;

     . = ALIGN (bsp_stack_align);
     bsp_stack_abt_start = .;
     . = . + bsp_stack_abt_size;

     . = ALIGN (bsp_stack_align);
     bsp_stack_fiq_start = .;
     . = . + bsp_stack_fiq_size;

     . = ALIGN (bsp_stack_align);
     bsp_stack_irq_start = .;
     . = . + bsp_stack_irq_size;

     . = ALIGN (bsp_stack_align);
     bsp_stack_svc_start = .;
     . = . + bsp_stack_svc_size;

     . = ALIGN (bsp_stack_align);
     bsp_stack_undef_start = .;
     . = . + bsp_stack_undef_size;

     . = ALIGN (bsp_section_align);

     /*
      * BSP: End of stack section
      */
     bsp_section_stack_end = .;
   } > RAM_INT

   .work_area : {
     /*
      * BSP: Start of work area.  The work area will occupy the remaining
      * RAM_EXT region and contains the RTEMS work space and heap.  We 
cannot
      * assign the region end directly since this leads to a region full
      * warning.
      */
     bsp_work_area_start = .;

     . = bsp_ram_ext_end - 4;

     . = ALIGN (bsp_section_align);

     /*
      * BSP: End of work area
      */
     bsp_work_area_end = .;
   } > RAM_EXT

   bsp_section_vector_size = bsp_section_vector_end - 
bsp_section_vector_start;

   bsp_section_text_size = bsp_section_text_end - bsp_section_text_start;

   bsp_section_data_size = bsp_section_data_end - bsp_section_data_start;

   bsp_section_bss_size = bsp_section_bss_end - bsp_section_bss_start;

   bsp_section_stack_size = bsp_section_stack_end - bsp_section_stack_start;

   bsp_work_area_size = bsp_work_area_end - bsp_work_area_start;

   /* 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) }
   /* DWARF 3 */
   .debug_pubtypes 0 : { *(.debug_pubtypes) }
   .debug_ranges   0 : { *(.debug_ranges) }
   .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }

   /DISCARD/ : {
     *(.note.GNU-stack) *(.gnu_debuglink)
   }

   /*
    * BSP: Catch all unknown sections
    */
   .nirvana : {
     *(*)
   } > NIRVANA
}

-- 
Sebastian Huber, Embedded Brains GmbH

Address : Obere Lagerstr. 30, D-82178 Puchheim, Germany
Phone   : +49 89 18 90 80 79-6
Fax     : +49 89 18 90 80 79-9
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the users mailing list