网站公告列表

  没有公告

加入收藏
设为首页
联系本站
您现在的位置: AnalogCN安诺电子 >> 文章 >> 技术交流 >> 文章正文
  Blackfin  LDF文件格式详解         ★★★ 【字体:
Blackfin  LDF文件格式详解
作者:佚名    文章来源:Internet    点击数:    更新时间:2007-11-5    
对ADSP-BF533 Blackfin处理器 ,VisualDSP++提供4个.LDF文件: 如果.LDF文件名没有后缀,那它就是“缺省的.LDF文件”。即,如果没有明确指定某个.LDF文件,编译器连接应用程序时会使用缺省的.LDF文件。例如,ADSP-BF531.ldf是ADSP-BF531 Blackfin处理器的缺省的.LDF文件。
对每个处理器,有三个.LDF文件,后缀是_C、_CPP和_ASM (例如ADSP-BF533_C.ldf)。这些.LDF文件是Expert Linker的模板。
Blackfin处理器的.LDF文件可以分为5个主要部分:
• 前导段
• 库选择
• run-time头选择
• 存储空间声明
• 代码/数据到存储器映射定义
每个.LDF文件处理一系列命令,允许通过提供少量命令行选项来把多种配置植入应用。通过在.LDF文件中大量使用预处理器宏,
*********************************************************************************
//ARCHITECTURE指令规定这个.LDF文件用于ADSP-BF533 Blackfin处理器。
ARCHITECTURE(ADSP-BF533)       
*********************************************************************************
SEARCH_DIR指令识别标准run-time库的位置,像VisualDSP++安装目录的Blackfin\lib子目录一样。链接器将$ADI_DSP置为VisualDSP++安装目录。
如果选择__NO_STD_LIB选项,不包括SEARCH_DIR指令,这意味着链接器没有搜索run-time库的缺省空间。这个选项由-no-std-lib编译器开关选择,确保应用仅被用户提供的库链接。
#ifndef __NO_STD_LIB
SEARCH_DIR( $ADI_DSP/Blackfin/lib )       
#endif
*********************************************************************************
这部分.LDF文件构建不同的宏和变量,目的是产生$LIBRARIES表,按需要的顺序搜索库和目标文件,解决引用问题。一些选项指定选择一个库对另一个库(如工作区激活版本对普通版本),其它选项指定选择一个库对另一个库顺序(如选择完全兼容的IEEE浮点支持版本对较高性能版)。
USE_FILEIO选项是强制定义的。这对在大部分开发周期内使用的printf()和其它与stdio-相关的函数,是必要的。禁用USE_FILEIO选项就禁用了所有与stdio-相关的I/O操作
/* Moving to primIO means that we must always include the FileIO support,
** so that printf() will work.
*/
#ifndef USE_FILEIO        /* { */
#define USE_FILEIO 1
#endif        /* } */
*********************************************************************************
/************************** USE_PROFILER *****************************/
#ifdef USE_PROFILER        /* { */
#define USE_PROFILER0
#endif        /* } */
*********************************************************************************
/************************** USE_PROFILER0 ****************************/
#ifdef USE_PROFILER0        /* { */
#ifdef __WORKAROUNDS_ENABLED        /* { */
#define PROFFLAG , prfflg0_532y.doj
#else
#define PROFFLAG , prfflg0_532.doj
#endif        /* } */
// The profiler needs File I/O to write its results.
#define USE_FILEIO 1
#ifndef USE_PROFILER        /* { */
#define USE_PROFILER
#endif        /* } */
#endif        /* } */
/************************** USE_PROFILER1*****************************/

#ifdef USE_PROFILER1        /* { */
#ifdef __WORKAROUNDS_ENABLED        /* { */
#define PROFFLAG , prfflg1_532y.doj
#else
#define PROFFLAG , prfflg1_532.doj
#endif        /* } */
#define USE_FILEIO 1
#ifndef USE_PROFILER        /* { */
#define USE_PROFILER
#endif        /* } */
#endif        /* } */
/************************** USE_PROFILER2 ****************************/
#ifdef USE_PROFILER2        /* { */
#ifdef __WORKAROUNDS_ENABLED        /* { */
#define PROFFLAG , prfflg2_532y.doj
#else
#define PROFFLAG , prfflg2_532.doj
#endif        /* } */
#define USE_FILEIO 1
#ifndef USE_PROFILER        /* { */
#define USE_PROFILER
#endif        /* } */
#endif        /* } */
/************************** PROFFLAG ******************************/
如果需要profiling的话,PROFFLAG被定义为一个目标文件的名称。如果不需要,就不定义PROFFLAG。
#ifndef PROFFLAG        /* { */
#define PROFFLAG
#endif        /* } */
/************************** OMEGA ******************************/
OMEGA是包括idle程序的文件名称。如果应用自动终止,如从main()返回或通过调用exit(),就使用这个程序。 只要链接时需要工作区,__WORKAROUNDS_ENABLED选项就被编译器驱动器定义;尽管编译时可以单独选择每个可用的工作区,不能对所有的工作区组合提供预构建库。因此,每个库和目标都有单个激活工作区版本,选择了所有的工作区。

#ifdef __WORKAROUNDS_ENABLED        /* { */
#define OMEGA idle532y.doj
#else
#define OMEGA idle532.doj
#endif        /* } */
/************************** MEMINIT******************************/
MEMINIT保持目标文件的名称,包括指向由存储器初始化实用程序产生的任何初始化数据的指针。除非随后的应用被存储器初始化程序处理,否则,这个指针是NULL指针。这个文件没有变量。

#define MEMINIT __initsbsz532.doj,

#ifdef __WORKAROUNDS_ENABLED        /* { */
#define LIBSMALL libsmall532y.dlb,
#define FLT64  libf64ieee532y.dlb
#else
#define LIBSMALL libsmall532.dlb,
#define FLT64  libf64ieee532.dlb
#endif        /* } */

M3_RESERVED选项用于模拟器。缺省时,模拟器将Blackfin处理器的堆栈用作工作区,不过,可以使用M3寄存器来替代它。构建的run-time库具有-reserve m3开关,允许使用寄存器替代堆栈用作工作区。但有少量程序需要额外的处理。如,如果保留了M3,中断处理程序可能不存储和恢复M3,但如果没保留,就必须进行这样存储和恢复。因此,用一些库的两个变量来处理这种情况。LIBM3包括异常处理程序setjmp()和longjmp(),而LIBDSP包括与DSP有关的优化程序,当M3被模拟器保留时,会损失一些性能。

#ifdef M3_RESERVED        /* { */
#ifdef __WORKAROUNDS_ENABLED        /* { */
#define LIBM3 libm3res532y.dlb
#define LIBDSP libdspm3res532y.dlb
#define SFTFLT libsftflt532y.dlb
#else
#define LIBM3 libm3res532.dlb
#define LIBDSP libdspm3res532.dlb
#define SFTFLT libsftflt532.dlb
#endif        /* } */
#else
*********************************************************************************

只要链接时需要工作区,__WORKAROUNDS_ENABLED选项就被编译器驱动器定义;尽管编译时可以单独选择每个可用的工作区,不能对所有的工作区组合提供预构建库。因此,每个库和目标都有单个激活工作区版本,选择了所有的工作区。

#ifdef __WORKAROUNDS_ENABLED        /* { */
#define LIBM3 libm3free532y.dlb
#define LIBDSP libdsp532y.dlb
#define SFTFLT libsftflt532y.dlb
#else
#define LIBM3 libm3free532.dlb
#define LIBDSP libdsp532.dlb
#define SFTFLT libsftflt532.dlb
#endif        /* } */
#endif        /* } */
*********************************************************************************

通过排序选择浮点库。完全兼容的库是独立的库,高性能库是LIBDSP的一部分。这两个库的排序根据需要的浮点库而改变。由–ieee-fp编译器开关设置IEEEFP选项,选择替代排序方案。

#ifdef IEEEFP        /* { */
#define FPLIBS SFTFLT, FLT64, LIBDSP
#else
#define FPLIBS FLT64, LIBDSP, SFTFLT
#endif        /* } */

#ifdef __WORKAROUNDS_ENABLED
#ifdef _DINKUM_IO
#define LIBC libc532y.dlb, librt_fileio532y.dlb, libio532y.dlb,
#else //_DINKUM_IO
#define LIBC libio532y.dlb, libc532y.dlb,
#endif
#else //__WORKAROUNDS_ENABLED
#ifdef _DINKUM_IO
#define LIBC libc532.dlb, librt_fileio532.dlb, libio532.dlb,
#else //_DINKUM_IO
#define LIBC libio532.dlb, libc532.dlb,
#endif
#endif
*********************************************************************************

这样选择的库被汇编到LIBS表,如果设置了__ADI_LIBEH__(链接时由–eh设置),可以选择与C++异常(–eh和–rtti开关)一起构建的C++库。合适的文件I/O库附到这个表上,形成完整的$LIBRARIES表。
#ifdef __WORKAROUNDS_ENABLED        /* { */
#ifdef __ADI_LIBEH__
#define LIBS LIBSMALL MEMINIT LIBC LIBM3, libevent532y.dlb, libx532y.dlb, libcpp532yx.dlb, libcpprt532yx.dlb, FPLIBS, libetsi532.dlb, libssl532.dlb, OMEGA
#else
#define LIBS LIBSMALL MEMINIT LIBC LIBM3, libevent532y.dlb, libx532y.dlb, libcpp532y.dlb, libcpprt532y.dlb, FPLIBS, libetsi532.dlb, libssl532.dlb, OMEGA
#endif
#else
#ifdef __ADI_LIBEH__
#define LIBS LIBSMALL MEMINIT LIBC LIBM3, libevent532.dlb, libx532.dlb, libcpp532x.dlb, libcpprt532x.dlb, FPLIBS, libetsi532.dlb, libssl532.dlb, OMEGA
#else
#define LIBS LIBSMALL MEMINIT LIBC LIBM3, libevent532.dlb, libx532.dlb,  libcpp532.dlb, libcpprt532.dlb, FPLIBS, libetsi532.dlb, libssl532.dlb, OMEGA
#endif
#endif        /* } */
#if defined(USE_FILEIO) || defined(USE_PROFGUIDE)
#ifdef __WORKAROUNDS_ENABLED        /* { */
$LIBRARIES = LIBS, librt_fileio532y.dlb;
#else
$LIBRARIES = LIBS, librt_fileio532.dlb;
#endif        /* } */
#else
#ifdef __WORKAROUNDS_ENABLED        /* { */
$LIBRARIES = LIBS, librt532y.dlb;
#else
$LIBRARIES = LIBS, librt532.dlb;
#endif        /* } */
#endif        /* } */

// Libraries from the command line are included in COMMAND_LINE_OBJECTS.

// If USER_CRT is defined to be a custom/SystemBuilder generated
// CRT file then link with that, otherwise determine which of the
// precompiled objects to use.
#ifdef USER_CRT /* { */
#ifdef __WORKAROUNDS_ENABLED /* { */
#define CRT USER_CRT, libprofile532y.dlb PROFFLAG
#else
#define CRT USER_CRT, libprofile532.dlb PROFFLAG
#endif /* } */
#else
#ifdef USE_PROFILER        /* { */
#ifdef USE_FILEIO        /* { */
#ifdef __WORKAROUNDS_ENABLED        /* { */
#define CRT crtsfpc532y.doj, libprofile532y.dlb PROFFLAG
#else
#define CRT crtsfpc532.doj, libprofile532.dlb PROFFLAG
#endif        /* } */
#else
#ifdef __WORKAROUNDS_ENABLED        /* { */
#define CRT crtscp532y.doj, libprofile532y.dlb PROFFLAG
#else
#define CRT crtscp532.doj, libprofile532.dlb PROFFLAG
#endif        /* } */
#endif  /* USE_FILEIO */        /* } */
#else
#ifdef USE_FILEIO        /* { */
#ifdef __WORKAROUNDS_ENABLED        /* { */
#define CRT  crtsfc532y.doj
#else
#define CRT  crtsfc532.doj
#endif        /* } */
#else
#ifdef __WORKAROUNDS_ENABLED        /* { */
#define CRT  crtsc532y.doj
#else
#define CRT  crtsc532.doj
#endif        /* } */
#endif  /* USE_FILEIO */        /* } */
#endif  /* USE_PROFILER */        /* } */
#endif /* USER_CRT } */

#ifdef __WORKAROUNDS_ENABLED        /* { */
#define ENDCRT , crtn532y.doj
#else
#define ENDCRT , crtn532.doj
#endif        /* } */

$OBJECTS = CRT, $COMMAND_LINE_OBJECTS ,cplbtab533.doj ENDCRT;


MEMORY
{

*********************************************************************************
核与系统的存储器映射的寄存器(MMR)在存储器的顶部。链接器不允许为核MMR定义存储器部分,这个存储器声明被通过注释去掉,不过还保留下来,以保持透明度。
MEM_SYS_MMRS  {        /* System memory-mapped registers - 2MB */
        TYPE(RAM) WIDTH(8)
        START(0xFFC00000) END(0xFFDFFFFF)
}

定义了L1中间结果暂存器,不过,.LDF文件不使用它。注意,静态初始化数据可能不会映射到中间结果暂存器。

MEM_L1_SCRATCH  {
        TYPE(RAM) WIDTH(8)
        START(0xFFB00000) END(0xFFB00FFF)
}
*********************************************************************************
L1指令存储器被分为代码和代码CACHE。代码CACHE可以被选作CACHE或代码空间。
/* Instruction SRAM, 80K, some useable as cache */
MEM_L1_CODE_CACHE {        /* L1 Instruction SRAM/Cache - 16K */
        TYPE(RAM) WIDTH(8)
        START(0xFFA10000) END(0xFFA13FFF)
}
MEM_L1_CODE {        /* L1 Instruction - 64K */
        TYPE(RAM) WIDTH(8)
        START(0xFFA00000) END(0xFFA0FFFF)
}
*********************************************************************************
L1数据存储器Bank B被分为数据和数据CACHE,前者进一步分为常数数据和堆栈使用的空间。总的来说,.LDF文件试图将堆栈放置到快速L1存储器中,因为编译器常常将堆栈用作函数参数和临时工作空间。
/* Data Bank B - 32K, half usable as cache. */
/* Split into sections for program layout. */
/* Data - normal data, 16K */
#ifdef USE_CACHE /* { */
MEM_L1_DATA_B_CACHE        {        /* L1 Data B SRAM/Cache - 16K */
        TYPE(RAM) WIDTH(8)
        START(0xFF904000) END(0xFF907FFF)
}
MEM_L1_DATA_B       {        /* L1 Data B SRAM - half of 16K */
        TYPE(RAM) WIDTH(8)
        START(0xFF902000) END(0xFF903FFF)
}
#else /*  } { USE_CACHE */
MEM_L1_DATA_B       {        /* L1 Data B SRAM - half of 16K + 16K */
        TYPE(RAM) WIDTH(8)
        START(0xFF902000) END(0xFF907FFF)
}
#endif /* } USE_CACHE */
/* Stack - 8K */
MEM_L1_DATA_B_STACK       {        /* L1 Data B SRAM cont. - other half of 16K */
        TYPE(RAM) WIDTH(8)
        START(0xFF900000) END(0xFF901FFF)
}
*********************************************************************************
L1数据存储器Bank A也有CACHE/非CACHE的划分。非CACHE区域有可选择的256字节用于命令行变量。这个IDDE_ARGS选项支持导配置文件导引优化(PGO),如前面所述。

/* Data Bank A - 32K, half usable as cache. */
/* Split into sections for program layout. */
/* Data - normal data, 16K. */
/* If cache disabled use MEM_L1_DATA_A_CACHE for heap else use SRAM */
MEM_L1_DATA_A_CACHE        {        /* L1 Data A SRAM/Cache - 16K */
        TYPE(RAM) WIDTH(8)
        START(0xFF804000) END(0xFF807FFF)
}
#ifdef IDDE_ARGS
MEM_ARGV        {
#define ARGV_START 0xFF803F00
        TYPE(RAM) WIDTH(8)
        START(0xFF803F00) END(0xFF803FFF)
}
MEM_L1_DATA_A        {        /* L1 Data A SRAM - most of 16K */
        TYPE(RAM) WIDTH(8)
        START(0xFF800000) END(0xFF803EFF)
}
#else
MEM_L1_DATA_A        {        /* L1 Data A SRAM - 16K */
        TYPE(RAM) WIDTH(8)
        START(0xFF800000) END(0xFF803FFF)
}
#endif
*********************************************************************************
定义了4个异步存储器Bank和一个SDRAM Bank。
MEM_ASYNC3     {        /* Async Bank 3 - 1MB */
        TYPE(RAM) WIDTH(8)
        START(0x20300000) END(0x203FFFFF)
}
MEM_ASYNC2     {        /* Async Bank 2 - 1MB */
        TYPE(RAM) WIDTH(8)
        START(0x20200000) END(0x202FFFFF)
}
MEM_ASYNC1     {        /* Async Bank 1 - 1MB */
        TYPE(RAM) WIDTH(8)
        START(0x20100000) END(0x201FFFFF)
}
MEM_ASYNC0     {        /* Async Bank 0 - 1MB */
        TYPE(RAM) WIDTH(8)
        START(0x20000000) END(0x200FFFFF)
}
*********************************************************************************

一个SDRAM Bank是存储器的最低Bank,是一个32 MB的空间
#ifdef PARTITION_EZKIT_SDRAM
MEM_SDRAM0_BANK0  { /* SDRAM: Ext Bank0, Int Bank0: 8MB */
    /* Used for heap */
    TYPE(RAM) WIDTH(8)
    START(0x00000004) END(0x007FFFFF)
}
MEM_SDRAM0_BANK1  { /* SDRAM: Ext Bank0, Int Bank1: 8MB */
    /* Used for data */
    TYPE(RAM) WIDTH(8)
    START(0x00800000) END(0x00FFFFFF)
}
MEM_SDRAM0_BANK2  { /* SDRAM: Ext Bank0, Int Bank2: 8MB */
    /* Used for data/bsz */
    TYPE(RAM) WIDTH(8)
    START(0x01000000) END(0x017FFFFF)
}
MEM_SDRAM0_BANK3  { /* SDRAM: Ext Bank0, Int Bank3: 8MB */
    /* Used for program */
    TYPE(RAM) WIDTH(8)
    START(0x01800000) END(0x01FFFFFF)
}
#else


/* Claim some of SDRAM Bank 0 for heap */
/* since it needs a separate section */

MEM_SDRAM0     {        /* SDRAM Bank 0 - 16MB-128M */
        TYPE(RAM) WIDTH(8)
        START(0x00004000) END(0x07FFFFFF)
}
*********************************************************************************
最低16 KB被声明为堆使用。注意堆不包括地址0x0000 0000,这个地址为C中的NULL指针保留,不能用来指向有效的数据。
MEM_SDRAM0_HEAP     {        /* Claim some for ext heap - 16K */
        TYPE(RAM) WIDTH(8)
        START(0x00000004) END(0x00003FFF)
}
#endif
}

PROCESSOR P0
{
*********************************************************************************
PROCESSOR指令将随后得到的.DXE文件写入$COMMAND_LINE_OUTPUT_FILE,这是链接器定义的输出文件名称,由编译器驱动器传递。
    OUTPUT( $COMMAND_LINE_OUTPUT_FILE )

        /* Following address must match start of MEM_PROGRAM */
        RESOLVE(start,0xffa00000)
*********************************************************************************
使用RESOLVE指令,start符号(CRT的第一个可执行部分)被直接映射到处理器的复位地址。如果使用配置文件导引优化(PGO),通过同样的方法,_argv_string符号被直接映射到变量部分的开头。
#ifdef IDDE_ARGS
        RESOLVE(___argv_string, ARGV_START)
#endif
*********************************************************************************
_main和start符号被明确命名,以免激活选项时,被链接器屏蔽。
        KEEP(start,_main)
*********************************************************************************
.LDF文件的其余部分将代码或数据通过存储区域从输入部分映射到输出部分。.LDF文件是通用的,目的是确保适用所有的情况。因此,像program和data1这样的部分,被映射到不同存储区域的大量输出部分中。当一个存储部分添满后,余下的可能会进入其它的部分。

    SECTIONS
    {
        program_ram
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(L1_code) $LIBRARIES(L1_code))
            INPUT_SECTIONS( $OBJECTS(cplb_code) $LIBRARIES(cplb_code))
            INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb))
            INPUT_SECTIONS( $OBJECTS(noncache_code) $LIBRARIES(noncache_code))
            INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program))
        } >MEM_L1_CODE
*********************************************************************************
一些项可以随意映射。C++对象仅能用于C++链接映射;代码和数据被映射到L1 SRAM (当指定USE_CACHE选项时,被映射到外部存储器)的CACHE区域中。
#ifndef USE_CACHE
        l1_code
        {
            INPUT_SECTION_ALIGN(4)
            ___l1_code_cache = 0;
            INPUT_SECTIONS( $OBJECTS(L1_code) $LIBRARIES(L1_code))
            INPUT_SECTIONS( $OBJECTS(cplb_code) $LIBRARIES(cplb_code))
            INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb))
            INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program))
        } >MEM_L1_CODE_CACHE
#endif /* USE_CACHE */

        data_L1_data_a
        {
            INPUT_SECTION_ALIGN(4)
#ifndef USE_CACHE
            ___l1_data_cache_a = 0;
#endif
            INPUT_SECTIONS( $OBJECTS(L1_data_a) $LIBRARIES(L1_data_a))
               INPUT_SECTIONS( $OBJECTS(vtbl) $LIBRARIES(vtbl) )
               INPUT_SECTIONS( $OBJECTS(.frt) $LIBRARIES(.frt) )
               INPUT_SECTIONS( $OBJECTS(.frtl) $LIBRARIES(.frtl) )
               INPUT_SECTIONS( $OBJECTS(ctor) $LIBRARIES(ctor) )
               INPUT_SECTIONS( $OBJECTS(ctorl) $LIBRARIES(ctorl) )
               INPUT_SECTIONS( $OBJECTS(.gdt) $LIBRARIES(.gdt) )
               INPUT_SECTIONS( $OBJECTS(.gdtl) $LIBRARIES(.gdtl) )
               INPUT_SECTIONS( $OBJECTS(.edt) $LIBRARIES(.edt) )
               INPUT_SECTIONS( $OBJECTS(.cht) $LIBRARIES(.cht) )
            INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data))
            INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1))
            INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata))
        } >MEM_L1_DATA_A

        constdata_L1_data_a
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata))
        } >MEM_L1_DATA_A

        data_L1_data_b
        {
            INPUT_SECTION_ALIGN(4)
#ifndef USE_CACHE
            ___l1_data_cache_b = 0;
#endif
            INPUT_SECTIONS( $OBJECTS(L1_data_b) $LIBRARIES(L1_data_b))
               INPUT_SECTIONS( $OBJECTS(.edt) $LIBRARIES(.edt) )
               INPUT_SECTIONS( $OBJECTS(.cht) $LIBRARIES(.cht) )
            INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data))
            INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1))
            INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata))
        } >MEM_L1_DATA_B
*********************************************************************************
.meminit部分被链接器区别对待。在链接时,.meminit中没有代码和数据。不过,一旦链接完成,.meminit部分会扩展,使存储区域中所有未使用的空间用来容纳被映射的内容。特殊的.LDF文件中,.meminit被映射到MEM_L1_DATA_B,因此,链接后,.meminit占据.DXE文件未使用的MEM_L1_DATA_B的其余部分。这定义了一个空白空间,存储器初始化程序可以用它来存储配置表。像bsz_init一样,.meminit部分通常映射到只读存储器空间。
        bsz_init
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(bsz_init) $LIBRARIES(bsz_init))
        } >MEM_L1_DATA_B
        .meminit {} >MEM_L1_DATA_B

        constdata_L1_data_b
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata))
        } >MEM_L1_DATA_B
*********************************************************************************
BSZ部分被标记为ZERO_INIT,它指示存储器初始化时,将相应部分初始化为空并且在运行时应该填充零。bsz_init部分包括指向存储器初始化程序产生的表的开始处的指针,通常被映射到只读存储器。为简单起见,在开发的初期,它被映射到常规数据部分。

        bsz_L1_data_b ZERO_INIT
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz))
        } >MEM_L1_DATA_B

        bsz_L1_data_a ZERO_INIT
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz))
        } >MEM_L1_DATA_A

#ifdef USE_CACHE /* { */
        l1_code
        {
            INPUT_SECTION_ALIGN(4)
            ___l1_code_cache = 1;
        } >MEM_L1_CODE_CACHE

        l1_data_a_cache
        {
            INPUT_SECTION_ALIGN(4)
             ___l1_data_cache_a = 1;
        } >MEM_L1_DATA_A_CACHE

        l1_data_b_cache
        {
            INPUT_SECTION_ALIGN(4)
            ___l1_data_cache_b = 1;
        } >MEM_L1_DATA_B_CACHE
#endif /* } USE_CACHE */

*********************************************************************************
堆栈和堆空间没有.LDF文件映射的数据。而是各自定义全局符号,包括它们的开始、结束地址和长度(对堆而言)。这允许Run-time Bank来决定运行时堆栈和堆的大小和位置,因此,在.LDF文件中,可以很容易地修改它们。注意CRT要求这些符号。
        stack
        {
            ldf_stack_space = .;
            ldf_stack_end = ldf_stack_space + MEMORY_SIZEOF(MEM_L1_DATA_B_STACK);
        } >MEM_L1_DATA_B_STACK

#if defined(USE_CACHE)  || defined(USE_SDRAM)/* { */
#if defined(PARTITION_EZKIT_SDRAM) /* { */
        heap
        {
            // Allocate a heap for the application
            ldf_heap_space = .;
            ldf_heap_end = ldf_heap_space + MEMORY_SIZEOF(MEM_SDRAM0_BANK0) - 1;
            ldf_heap_length = ldf_heap_end - ldf_heap_space;        
        } >MEM_SDRAM0_BANK0
#else
        heap
        {
            // Allocate a heap for the application
            ldf_heap_space = .;
            ldf_heap_end = ldf_heap_space + MEMORY_SIZEOF(MEM_SDRAM0_HEAP) - 1;
            ldf_heap_length = ldf_heap_end - ldf_heap_space;        
        } >MEM_SDRAM0_HEAP
#endif /* PARTITION_EZKIT_SDRAM } */
#else
        heap
        {
            // Allocate a heap for the application
            ldf_heap_space = .;
            ldf_heap_end = ldf_heap_space + MEMORY_SIZEOF(MEM_L1_DATA_A_CACHE) - 1;
            ldf_heap_length = ldf_heap_end - ldf_heap_space;        
        } >MEM_L1_DATA_A_CACHE
#endif /* USE_CACHE } */

#ifdef PARTITION_EZKIT_SDRAM /* { */
       sdram0_bank1
       {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(sdram0_bank1) $LIBRARIES(sdram0_bank1))
            INPUT_SECTIONS( $OBJECTS(sdram0_data) $LIBRARIES(sdram0_data))
            INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb))
            INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1))
            INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata))
            INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata))
            INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data))
       } >MEM_SDRAM0_BANK1

       sdram0_bank2
       {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(sdram0_bank1) $LIBRARIES(sdram0_bank1))
            INPUT_SECTIONS( $OBJECTS(sdram0_data) $LIBRARIES(sdram0_data))
            INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb))
            INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1))
            INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata))
            INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata))
            INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data))
       } >MEM_SDRAM0_BANK2

       sdram0_bank2_bsz ZERO_INIT
       {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz))
       } >MEM_SDRAM0_BANK2

       sdram0_bank3
       {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(sdram0_bank3) $LIBRARIES(sdram0_bank3))
            INPUT_SECTIONS( $OBJECTS(noncache_code) $LIBRARIES(noncache_code))
            INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program))
            INPUT_SECTIONS( $OBJECTS(cplb_code) $LIBRARIES(cplb_code))
       } >MEM_SDRAM0_BANK3
#else
        sdram
        {
                INPUT_SECTIONS($COMMAND_LINE_OBJECTS(mydata1) $COMMAND_LINE_OBJECTS(mydata2) $COMMAND_LINE_OBJECTS(mydata3))
#if defined(USE_CACHE) || defined(USE_SDRAM) /* { */
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(sdram0) $LIBRARIES(sdram0))
            INPUT_SECTIONS( $OBJECTS(noncache_code) $LIBRARIES(noncache_code))
            INPUT_SECTIONS( $OBJECTS(program) $LIBRARIES(program))
            INPUT_SECTIONS( $OBJECTS(cplb) $LIBRARIES(cplb))
            INPUT_SECTIONS( $OBJECTS(cplb_code) $LIBRARIES(cplb_code))
            INPUT_SECTIONS($OBJECTS(data1) $LIBRARIES(data1))
            INPUT_SECTIONS($OBJECTS(voldata) $LIBRARIES(voldata))
            INPUT_SECTIONS($OBJECTS(constdata) $LIBRARIES(constdata))
            INPUT_SECTIONS( $OBJECTS(cplb_data) $LIBRARIES(cplb_data))
#endif /* USE_CACHE } */
        } >MEM_SDRAM0

#if defined(USE_CACHE) || defined(USE_SDRAM) /* { */
        bsz_sdram0 ZERO_INIT
        {
            INPUT_SECTION_ALIGN(4)
            INPUT_SECTIONS( $OBJECTS(bsz) $LIBRARIES(bsz))
        } >MEM_SDRAM0
#endif /* USE_CACHE } */
#endif

    }
}
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    前置放大器在移动医疗服务系
    便携式多通道大容量生理信号
    防腐监测仪的设计与应用
    基于AD1674的酶标仪的设计
    基于C/S模式的JRTPLIB库的测
    ffmpeg与jrtplib相结合应用
    blackfin模拟摄像头驱动中的
    可编程逻辑在数字信号处理系
    发现VDSP4.5一个BUG:单步调
    VDSP5.0双核工程下sml3中的变
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    版权所有:AnalogCN安诺电子 湘ICP备06016315号