/*
|
** ADSP-1802 linker description file generated on Aug 05, 2024 at 15:33:23.
|
*/
|
/*
|
** Copyright (C) 2000-2024 Analog Devices Inc., All Rights Reserved.
|
**
|
** This file is generated automatically based upon the options selected
|
** in the System Configuration utility. Changes to the LDF configuration
|
** should be made by modifying the appropriate options rather than editing
|
** this file. To access the System Configuration utility, double-click the
|
** system.svc file from a navigation view.
|
**
|
** Custom additions can be inserted within the user-modifiable sections. These
|
** sections are bounded by comments that start with "$VDSG". Only changes
|
** placed within these sections are preserved when this file is re-generated.
|
**
|
** Product : CrossCore Embedded Studio
|
** Tool Version : 6.2.3.6
|
*/
|
|
ARCHITECTURE(ADSP-1802)
|
|
/*
|
** Define a linked library list.
|
*/
|
$LIBRARIES =
|
libcc.dlb
|
,libc.dlb
|
,libio.dlb
|
,libcpp.dlb
|
,libosal_noos.dlb
|
,libprofile.dlb
|
,libssl.dlb
|
,libdsp.dlb
|
,libdyn.dlb
|
;
|
|
/*
|
** Define a linked objects list.
|
*/
|
$OBJECTS =
|
"app_startup.doj"
|
,$COMMAND_LINE_OBJECTS
|
;
|
|
/*
|
** List of all objects and libraries.
|
*/
|
$OBJS_LIBS = $OBJECTS, $LIBRARIES;
|
|
/*
|
** List of objects and libraries which prefer internal memory as
|
** specified by prefersMem attribute.
|
*/
|
$OBJS_LIBS_INTERNAL =
|
$OBJS_LIBS{prefersMem("internal")}
|
;
|
|
/*
|
** List of objects and libraries which don't have a preference for
|
** external memory as specified by prefersMem attribute.
|
*/
|
$OBJS_LIBS_NOT_EXTERNAL =
|
$OBJS_LIBS{!prefersMem("external")}
|
;
|
|
|
MEMORY
|
{
|
/* ADSP-1802 MEMORY MAP.
|
**
|
** The SHARC 1802 has 5Mbit RAM in total.
|
**
|
** -------------------------- BLOCK 0 ---------------------------------------
|
** 0x0008 C000 to 0x0009 3FFF Normal word (48) Space (1.5 Mbit RAM)
|
** 0x0009 2000 to 0x0009 DFFF Normal word (32) Space (1.5 Mbit RAM)
|
** 0x0012 4000 to 0x0013 BFFF Short word (16) Space (1.5 Mbit RAM)
|
**
|
** Notes:
|
** 1) The interrupt Vector Table (IVT) code is placed in internal memory
|
** by default and has to use ISA (NW, 48 bit) instructions.
|
** 2) The loader kernel uses 256 ISA instructions from the start of the
|
** IVT. The final action it does is to load the application code to these
|
** address overwriting it's own code. The application code in these
|
** addresses therefore must also be ISA instructions. Do not put
|
** VISA (SW) instructions in these 256 locations.
|
*/
|
mem_iv_code { TYPE(PM RAM) START(0x0008C000) END(0x0008C0A7) WIDTH(48) }
|
mem_block0_nwco { TYPE(PM RAM) START(0x0008C0A8) END(0x0008C0FF) WIDTH(48) }
|
mem_block0_sw16 { TYPE(SW RAM) START(0x00124300) END(0x0013BFFF) WIDTH(16) }
|
|
/*
|
** -------------------------- BLOCK 1 ---------------------------------------
|
** 0x000A C000 to 0x000B 3FFF Normal word (48) Space (1.5 Mbit RAM)
|
** 0x000B 2000 to 0x000B DFFF Normal word (32) Space (1.5 Mbit RAM)
|
** 0x0016 4000 to 0x0017 BFFF Short word (16) Space (1.5 Mbit RAM)
|
*/
|
mem_block1_dm32 { TYPE(DM RAM) START(0x000B2000) END(0x000B7FFF) WIDTH(32) }
|
mem_internal1 { TYPE(DM RAM) START(0x000B8000) END(0x000BDFFF) WIDTH(32) }
|
|
/*
|
** -------------------------- BLOCK 2 ---------------------------------------
|
** 0x000C 0000 to 0x000C 5554 Normal word (48) Space (1 Mbit RAM)
|
** 0x000C 0000 to 0x000C 7FFF Normal word (32) Space (1 Mbit RAM)
|
** 0x0018 0000 to 0x0018 FFFF Short word (16) Space (1 Mbit RAM)
|
*/
|
mem_block2_pm32 { TYPE(PM RAM) START(0x000C0000) END(0x000C1FFF) WIDTH(32) }
|
mem_internal2 { TYPE(PM RAM) START(0x000C2000) END(0x000C7FFF) WIDTH(32) }
|
|
/*
|
** -------------------------- BLOCK 3 ---------------------------------------
|
** 0x000E 0000 to 0x000E 5554 Normal word (48) Space (1 Mbit RAM)
|
** 0x000E 0000 to 0x000E 7FFF Normal word (32) Space (1 Mbit RAM)
|
** 0x001C 0000 to 0x001C FFFF Short word (16) Space (1 Mbit RAM)
|
*/
|
mem_block3_dm32 { TYPE(DM RAM) START(0x000E0000) END(0x000E7FFF) WIDTH(32) }
|
|
/*
|
** -------------------------- L2 Memory -------------------------------------
|
** There is 1MB of L2 memory split over two banks.
|
**
|
** This LDF defines L2 memory bank 0 section only in SW format. It is
|
** not necessary to partition memory for different widths and different
|
** input types.
|
**
|
** The output sections that populate the L2 bank 0 memory are defined to
|
** use one of the following qualifiers:
|
**
|
** PM (ISA code)
|
** PM 32 (PM data)
|
** DM (DM data)
|
** SW (VISA code)
|
**
|
** The linker filters the inputs for each output section to match
|
** these output section qualfiers. Each output section uses the same
|
** SW memory segment which the linker packs correctly for each
|
** qualifier.
|
**
|
*/
|
mem_l2bank0_sw16 { TYPE(SW RAM) START(0x0060000A) END(0x00639FFF) WIDTH(16) }
|
mem_scene_data { TYPE(SW RAM) START(0x0063A000) END(0x0063FFFF) WIDTH(16) }
|
/* L2 Bank 1 is only for data so is defined in DM format. */
|
mem_l2bank1_dm32 { TYPE(DM RAM) START(0x04000000) END(0x0401FFFF) WIDTH(32) }
|
} /* MEMORY */
|
|
PROCESSOR p0
|
{
|
OUTPUT($COMMAND_LINE_OUTPUT_FILE)
|
KEEP(_main)
|
KEEP(___ctor_NULL_marker)
|
SECTIONS
|
{
|
#define IV_CODE dxe_iv_code
|
IV_CODE PM
|
{
|
INPUT_SECTIONS( $OBJECTS(iv_code) )
|
} > mem_iv_code
|
|
dxe_block0_nw_code PM
|
{
|
INPUT_SECTIONS( $OBJS_LIBS(seg_int_code seg_init seg_pmco) )
|
} > mem_block0_nwco
|
|
dxe_block0_sw_code_prio0 SW
|
{
|
FILL(0x1) /* fill in gaps in the memory with NOPs */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_int_code_sw seg_int_code) )
|
} > mem_block0_sw16
|
|
dxe_block0_nw_code_prio0 PM
|
{
|
INPUT_SECTIONS( $OBJS_LIBS(seg_int_code) )
|
INPUT_SECTIONS( $OBJS_LIBS(seg_init) )
|
} > mem_block0_sw16
|
|
dxe_block0_sw_code_prio1 SW
|
{
|
FILL(0x1) /* fill in gaps in the memory with NOPs */
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_swco seg_pmco) )
|
} > mem_block0_sw16
|
|
dxe_block0_nw_code_prio1 PM
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL( seg_pmco ) )
|
} > mem_block0_sw16
|
|
dxe_block0_sw_code_prio2 SW
|
{
|
FILL(0x1) /* fill in gaps in the memory with NOPs */
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_swco seg_pmco) )
|
INPUT_SECTIONS( $OBJS_LIBS(seg_swco seg_pmco) )
|
} > mem_block0_sw16
|
|
#define BLOCK0_SW_CODE dxe_block0_sw_code_prio3
|
BLOCK0_SW_CODE SW
|
{
|
FILL(0x1) /* fill in gaps in the memory with NOPs */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_swco seg_pmco) )
|
} > mem_block0_sw16
|
|
#define BLOCK0_NW_CODE dxe_block0_nw_code_prio3
|
BLOCK0_NW_CODE PM
|
{
|
INPUT_SECTIONS( $OBJS_LIBS(seg_pmco) )
|
} > mem_block0_sw16
|
|
dxe_block2_pm_data
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_pmda) )
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_pmda) )
|
INPUT_SECTIONS( $OBJS_LIBS(seg_pmda) )
|
} > mem_block2_pm32
|
|
dxe_block1_dm_data_prio0
|
{
|
RESERVE(heaps_and_system_stack_in_L1, heaps_and_system_stack_in_L1_length = 12288, 2)
|
INPUT_SECTIONS( $OBJS_LIBS(seg_int_data) )
|
} > mem_block1_dm32
|
|
dxe_block1_dm_data_prio1
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_dmda seg_vtbl) )
|
} > mem_block1_dm32
|
|
dxe_block1_bsz_prio1 ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(.bss) )
|
} > mem_block1_dm32
|
|
dxe_block1_dm_data_prio2
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_dmda seg_vtbl) )
|
} > mem_block1_dm32
|
|
dxe_block1_bsz_prio2 ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(.bss) )
|
} > mem_block1_dm32
|
|
dxe_block1_dm_data_prio3
|
{
|
INPUT_SECTIONS( $OBJS_LIBS(seg_dmda seg_vtbl .rtti .cht .edt) )
|
} > mem_block1_dm32
|
|
dxe_block1_bsz_prio3 ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS(.bss) )
|
} > mem_block1_dm32
|
|
dxe_block3_dm_data_prio0
|
{
|
RESERVE(heaps_and_system_heap_in_L1, heaps_and_system_heap_in_L1_length = 12288, 2)
|
INPUT_SECTIONS( $OBJS_LIBS(seg_int_data) )
|
} > mem_block3_dm32
|
|
dxe_block3_dm_data_prio1
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_dmda seg_vtbl) )
|
} > mem_block3_dm32
|
|
dxe_block3_bsz_prio1 ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(.bss) )
|
} > mem_block3_dm32
|
|
dxe_block3_dm_data_prio2
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_dmda seg_vtbl) )
|
} > mem_block3_dm32
|
|
dxe_block3_bsz_prio2 ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(.bss) )
|
} > mem_block3_dm32
|
|
dxe_block3_dm_data_prio3
|
{
|
INPUT_SECTIONS( $OBJS_LIBS(seg_dmda seg_vtbl .rtti .cht .edt) )
|
} > mem_block3_dm32
|
|
dxe_block3_bsz_prio3 ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS(.bss) )
|
} > mem_block3_dm32
|
|
dxe_block3_overflow_data
|
{
|
/* Use any unused memory in the dm data designated blocks 1 and 3
|
** for pm data if we've not been able to map it to block 2.
|
*/
|
INPUT_SECTIONS( $OBJS_LIBS(seg_pmda) )
|
} > mem_block3_dm32
|
|
dxe_block3_heap NO_INIT
|
{
|
RESERVE_EXPAND(heaps_and_system_heap_in_L1, heaps_and_system_heap_in_L1_length, 0, 2)
|
ldf_heap_space = heaps_and_system_heap_in_L1;
|
ldf_heap_end = (ldf_heap_space + (heaps_and_system_heap_in_L1_length - 2)) & 0xfffffffe;
|
ldf_heap_length = ldf_heap_end - ldf_heap_space;
|
} > mem_block3_dm32
|
|
dxe_block1_overflow_data
|
{
|
/* Use any unused memory in the dm data designated blocks 1 and 3
|
** for pm data if we've not been able to map it to block 2.
|
*/
|
INPUT_SECTIONS( $OBJS_LIBS(seg_pmda) )
|
} > mem_block1_dm32
|
|
dxe_block1_stack NO_INIT
|
{
|
RESERVE_EXPAND(heaps_and_system_stack_in_L1, heaps_and_system_stack_in_L1_length, 0, 2)
|
ldf_stack_space = heaps_and_system_stack_in_L1;
|
ldf_stack_end = (ldf_stack_space + (heaps_and_system_stack_in_L1_length - 2)) & 0xfffffffe;
|
ldf_stack_length = ldf_stack_end - ldf_stack_space;
|
} > mem_block1_dm32
|
|
dxe_block2_overflow_data
|
{
|
// Use any unused memory in the pm data designated block 2 for
|
// dm data if we've not been able to map it to the dm data blocks
|
// 1 and 3.
|
INPUT_SECTIONS( $OBJS_LIBS(seg_int_data seg_dmda seg_vtbl .rtti .cht .edt) )
|
} > mem_block2_pm32
|
|
dxe_block2_bsz ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS(.bss) )
|
} > mem_block2_pm32
|
|
// ------------------------------------------------------------------
|
// L2 - core memory
|
|
dxe_l2bank0_sw_code SW
|
{
|
FILL(0x1) /* fill in gaps in the memory with NOPs */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2 seg_l2_swco seg_swco seg_pmco) )
|
} > mem_l2bank0_sw16
|
|
dxe_l2bank0_nw_code PM
|
{
|
/* ISA code */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2 seg_l2_pmco seg_pmco) )
|
} > mem_l2bank0_sw16
|
|
dxe_l2bank0_pm_data PM 32
|
{
|
/* L2 pm data */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2 seg_pmda) )
|
} > mem_l2bank0_sw16
|
|
dxe_l2bank1_cpp_ctors
|
{
|
FORCE_CONTIGUITY
|
__ctors = .; /* __ctors points to the start of the section */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_ctdm) )
|
INPUT_SECTIONS( $OBJS_LIBS(seg_ctdml) )
|
} > mem_l2bank1_dm32
|
|
dxe_l2bank1_cpp_eh_gdt
|
{
|
FORCE_CONTIGUITY
|
/* C++ exceptions data table */
|
INPUT_SECTIONS( $OBJS_LIBS(.gdt) )
|
INPUT_SECTIONS( $OBJS_LIBS(.gdtl) )
|
} > mem_l2bank1_dm32
|
|
dxe_l2bank1_dm_data
|
{
|
RESERVE(heaps_and_system_stack_in_L2, heaps_and_system_stack_in_L2_length = 130048, 2)
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2 seg_l2_dmda seg_dmda seg_vtbl .rtti .cht .edt) )
|
} > mem_l2bank1_dm32
|
|
dxe_l2bank1_bsz ZERO_INIT
|
{
|
/* L2 zero init data */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2_bsz_data seg_bsz_data .bss) )
|
} > mem_l2bank1_dm32
|
|
dxe_l2bank1_noinit NO_INIT
|
{
|
/* L2 no init data */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2_noinit_data seg_noinit_data) )
|
} > mem_l2bank1_dm32
|
|
dxe_l2bank1_pm_data
|
{
|
/* L2 pm data */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2 seg_pmda) )
|
} > mem_l2bank1_dm32
|
|
dxe_l2bank1_heaps_and_stack_expand NO_INIT
|
{
|
/* Expand the stack/heap to use the rest of available L2 bank 1 */
|
RESERVE_EXPAND(heaps_and_system_stack_in_L2, heaps_and_system_stack_in_L2_length, 0, 2)
|
MyHeap2_space = heaps_and_system_stack_in_L2 + 2;
|
MyHeap2_end = (MyHeap2_space + (heaps_and_system_stack_in_L2_length - 2)) & 0xfffffffe;
|
MyHeap2_length = MyHeap2_end - MyHeap2_space;
|
} > mem_l2bank1_dm32
|
|
// Place DM data we couldn't link internally or to L2 bank 1 into
|
// any remaining memory available in L2 bank 0.
|
dxe_l2bank0_dm_data DM
|
{
|
RESERVE(heaps_and_system_heap_in_L2, heaps_and_system_heap_in_L2_length = 76800, 2)
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2 seg_l2_dmda seg_dmda seg_vtbl .rtti .cht .edt) )
|
} > mem_l2bank0_sw16
|
|
seg_scene_data DM
|
{
|
INPUT_SECTIONS( $OBJECTS(scene_mem) $LIBRARIES(scene_mem))
|
} > mem_scene_data
|
|
dxe_l2bank0_bsz ZERO_INIT DM
|
{
|
/* L2 zero init data */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2_bsz_data seg_bsz_data .bss) )
|
} > mem_l2bank0_sw16
|
|
dxe_l2bank0_noinit NO_INIT DM
|
{
|
/* L2 no init data */
|
INPUT_SECTIONS( $OBJS_LIBS(seg_l2_noinit_data seg_noinit_data) )
|
} > mem_l2bank0_sw16
|
|
dxe_l2bank0_heaps_and_stack_expand NO_INIT
|
{
|
/* Expand the stack/heap to use the rest of available L2 bank 1 */
|
RESERVE_EXPAND(heaps_and_system_heap_in_L2, heaps_and_system_heap_in_L2_length, 0, 2)
|
MyHeap4_space = heaps_and_system_heap_in_L2 + 2;
|
MyHeap4_end = (MyHeap4_space + (heaps_and_system_heap_in_L2_length - 2)) & 0xfffffffe;
|
MyHeap4_length = MyHeap4_end - MyHeap4_space;
|
} > mem_l2bank0_sw16
|
|
} /* SECTIONS */
|
} /* p0 */
|