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