This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:链接器文件存储器范围错误

Guru**** 2607805 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1060114/tms320f28379d-linker-file-memory-range-errors

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

您好!

我在 C2000Ware_3_04_00_00中使用以下空项目

C:\C2000Ware_3_04_00_00\driverlib\f2837xd\examples\dual\empty_projects

在项目中编写了一些代码后、我开始遇到以下错误。

由于 RAM 不足、我在项目中添加了"RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3"部分。

我的项目的"2837xD_RAM_lnk_CPU1.cmd"文件已附加。

/cfs-file/__key/communityserver-discussions-components-files 171/2837xD_5F00_RAM_5F00_lnk_5F00_cpu1.rar

我们如何解决该误差?

谢谢、

Sinan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sinan、

    您可以组合连续 的存储器以形成 更大的内存块、以便可以容纳较大的段。

    例如:  

    /* RAMLS4:origin = 0x00A000,length = 0x000800 */
    /* RAMLS5:origin = 0x00A800,length = 0x000800 */
    RAMLS4_5:origin = 0x00A000、length = 0x001000

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena:

    [引用 userid="128297" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060114/tms320f28379d-linker-file-memory-range-errors/3922899#3922899"]

    例如:  

    /* RAMLS4:origin = 0x00A000,length = 0x000800 */
    /* RAMLS5:origin = 0x00A800,length = 0x000800 */
    RAMLS4_5:origin = 0x00A000、length = 0x001000

    [/报价]

    正如你所说的那样,我这样做了,但问题没有得到解决。

    我已将 RAMLS4_5添加到链接器文件的.text 段。 此外、我将 下图中的"--gen_"设置设置为"on"。

    我的"2837xD_FLASH_lnk_CPU1.cmd"文件如下所示:

    MEMORY
    {
    PAGE 0 :
       /* BEGIN is used for the "boot to SARAM" bootloader mode   */
    
       BEGIN            : origin = 0x000000, length = 0x000002
       RAMM0            : origin = 0x000123, length = 0x0002DD
       RAMD0            : origin = 0x00B000, length = 0x000800
       RAMLS0           : origin = 0x008000, length = 0x000800 
       RAMLS1           : origin = 0x008800, length = 0x000800
       RAMLS2           : origin = 0x009000, length = 0x000800
       RAMLS3           : origin = 0x009800, length = 0x000800
    //   RAMLS4           : origin = 0x00A000, length = 0x000800
       RESET            : origin = 0x3FFFC0, length = 0x000002
    
    PAGE 1 :
    
       BOOT_RSVD       : origin = 0x000002, length = 0x000121     /* Part of M0, BOOT rom will use this for stack */
       RAMM1           : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
    //   RAMM1_RSVD      : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       RAMD1           : origin = 0x00B800, length = 0x000800
    
    //   RAMLS5      : origin = 0x00A800, length = 0x000800
       RAMLS4_5    : origin = 0x00A000, length = 0x001000
    
       RAMGS0      : origin = 0x00C000, length = 0x001000
       RAMGS1      : origin = 0x00D000, length = 0x001000
       RAMGS2      : origin = 0x00E000, length = 0x001000
       RAMGS3      : origin = 0x00F000, length = 0x001000
       RAMGS4      : origin = 0x010000, length = 0x001000
       RAMGS5      : origin = 0x011000, length = 0x001000
       RAMGS6      : origin = 0x012000, length = 0x001000
       RAMGS7      : origin = 0x013000, length = 0x001000
       RAMGS8      : origin = 0x014000, length = 0x001000
       RAMGS9      : origin = 0x015000, length = 0x001000
       RAMGS10     : origin = 0x016000, length = 0x001000
    
    //   RAMGS11     : origin = 0x017000, length = 0x000FF8   /* Uncomment for F28374D, F28376D devices */
    
    //   RAMGS11_RSVD : origin = 0x017FF8, length = 0x000008    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       RAMGS11     : origin = 0x017000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS12     : origin = 0x018000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS13     : origin = 0x019000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS14     : origin = 0x01A000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS15     : origin = 0x01B000, length = 0x000FF8     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       
    //   RAMGS15_RSVD : origin = 0x01BFF8, length = 0x000008    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
                                                                /* Only on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    
       CPU2TOCPU1RAM   : origin = 0x03F800, length = 0x000400
       CPU1TOCPU2RAM   : origin = 0x03FC00, length = 0x000400
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
    }
    
    
    SECTIONS
    {
       codestart        : > BEGIN,     PAGE = 0
       .text            : >> RAMD0 |  RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4_5,   PAGE = 0
       .cinit           : > RAMM0,     PAGE = 0
       .switch          : > RAMM0,     PAGE = 0
       .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */
       .stack           : > RAMM1,     PAGE = 1
    
    #if defined(__TI_EABI__)
       .bss             : > RAMLS4_5,    PAGE = 1
       .bss:output      : > RAMLS3,    PAGE = 0
       .init_array      : > RAMM0,     PAGE = 0
       .const           : > RAMLS4_5,    PAGE = 1
       .data            : > RAMLS4_5,    PAGE = 1
       .sysmem          : > RAMLS4_5,    PAGE = 1
    #else
       .pinit           : > RAMM0,     PAGE = 0
    //   .ebss            : > RAMLS5,    PAGE = 1
       .ebss : >> RAMGS5 | RAMGS0 | RAMGS1 PAGE = 1
       .econst          : > RAMLS4_5,    PAGE = 1
       .esysmem         : > RAMLS4_5,    PAGE = 1
    #endif
    
       Filter_RegsFile  : > RAMGS0,    PAGE = 1
    
    
       ramgs0           : > RAMGS0,    PAGE = 1
       ramgs1           : > RAMGS1,    PAGE = 1
    
    #ifdef __TI_COMPILER_VERSION__
       #if __TI_COMPILER_VERSION__ >= 15009000
        .TI.ramfunc : {} > RAMM0,      PAGE = 0
       #else
        ramfuncs    : > RAMM0      PAGE = 0   
       #endif
    #endif
    
       /* The following section definitions are required when using the IPC API Drivers */
        GROUP : > CPU1TOCPU2RAM, PAGE = 1
        {
            PUTBUFFER
            PUTWRITEIDX
            GETREADIDX
        }
    
        GROUP : > CPU2TOCPU1RAM, PAGE = 1
        {
            GETBUFFER :    TYPE = DSECT
            GETWRITEIDX :  TYPE = DSECT
            PUTREADIDX :   TYPE = DSECT
        }
    
        /* The following section definition are for SDFM examples */
       Filter1_RegsFile : > RAMGS1, PAGE = 1, fill=0x1111
       Filter2_RegsFile : > RAMGS2, PAGE = 1, fill=0x2222
       Filter3_RegsFile : > RAMGS3, PAGE = 1, fill=0x3333
       Filter4_RegsFile : > RAMGS4, PAGE = 1, fill=0x4444
       Difference_RegsFile : >RAMGS5,   PAGE = 1, fill=0x3333
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

    此致、
    Sinan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请注意错误消息。 显示.text 的大小为0x1de7、各个存储块的大小为0x800。 若要放入大小 为0x1de7的段、需要组合4个连续存储器

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我组合了 RAMLS2、RAMLS3、RAMLS4和 RAMLS5存储器分区。 但再说一次、它没有。

    MEMORY
    {
    PAGE 0 :
       /* BEGIN is used for the "boot to SARAM" bootloader mode   */
    
       BEGIN            : origin = 0x000000, length = 0x000002
       RAMM0            : origin = 0x000123, length = 0x0002DD
       RAMD0            : origin = 0x00B000, length = 0x000800
       RAMLS0           : origin = 0x008000, length = 0x000800 
       RAMLS1           : origin = 0x008800, length = 0x000800
    //   RAMLS2           : origin = 0x009000, length = 0x000800
    //   RAMLS3           : origin = 0x009800, length = 0x000800
    //   RAMLS4           : origin = 0x00A000, length = 0x000800
       RESET            : origin = 0x3FFFC0, length = 0x000002
    
    PAGE 1 :
    
       BOOT_RSVD       : origin = 0x000002, length = 0x000121     /* Part of M0, BOOT rom will use this for stack */
       RAMM1           : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
    //   RAMM1_RSVD      : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       RAMD1           : origin = 0x00B800, length = 0x000800
    
    //   RAMLS5      : origin = 0x00A800, length = 0x000800
       RAMLS2_3_4_5    : origin = 0x009000, length = 0x002000
    
       RAMGS0      : origin = 0x00C000, length = 0x001000
       RAMGS1      : origin = 0x00D000, length = 0x001000
       RAMGS2      : origin = 0x00E000, length = 0x001000
       RAMGS3      : origin = 0x00F000, length = 0x001000
       RAMGS4      : origin = 0x010000, length = 0x001000
       RAMGS5      : origin = 0x011000, length = 0x001000
       RAMGS6      : origin = 0x012000, length = 0x001000
       RAMGS7      : origin = 0x013000, length = 0x001000
       RAMGS8      : origin = 0x014000, length = 0x001000
       RAMGS9      : origin = 0x015000, length = 0x001000
       RAMGS10     : origin = 0x016000, length = 0x001000
    
    //   RAMGS11     : origin = 0x017000, length = 0x000FF8   /* Uncomment for F28374D, F28376D devices */
    
    //   RAMGS11_RSVD : origin = 0x017FF8, length = 0x000008    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       RAMGS11     : origin = 0x017000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS12     : origin = 0x018000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS13     : origin = 0x019000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS14     : origin = 0x01A000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS15     : origin = 0x01B000, length = 0x000FF8     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       
    //   RAMGS15_RSVD : origin = 0x01BFF8, length = 0x000008    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
                                                                /* Only on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    
       CPU2TOCPU1RAM   : origin = 0x03F800, length = 0x000400
       CPU1TOCPU2RAM   : origin = 0x03FC00, length = 0x000400
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
    }
    
    
    SECTIONS
    {
       codestart        : > BEGIN,     PAGE = 0
       .text            : >> RAMD0 |  RAMLS0 | RAMLS1 | RAMLS2_3_4_5,   PAGE = 0
    //   .text            : >> RAMD0 |  RAMLS0_1 | RAMLS2 | RAMLS3 | RAMLS4,   PAGE = 0
    //   .text            : >> RAMD0 |  RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4 | RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3,   PAGE = 0
       .cinit           : > RAMM0,     PAGE = 0
       .switch          : > RAMM0,     PAGE = 0
       .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */
       .stack           : > RAMM1,     PAGE = 1
    
    #if defined(__TI_EABI__)
       .bss             : > RAMLS2_3_4_5,    PAGE = 1
       .bss:output      : > RAMLS2_3_4_5,    PAGE = 0
       .init_array      : > RAMM0,     PAGE = 0
       .const           : > RAMLS2_3_4_5,    PAGE = 1
       .data            : > RAMLS2_3_4_5,    PAGE = 1
       .sysmem          : > RAMLS2_3_4_5,    PAGE = 1
    #else
       .pinit           : > RAMM0,     PAGE = 0
    //   .ebss            : > RAMLS5,    PAGE = 1
       .ebss : >> RAMGS5 | RAMGS0 | RAMGS1 PAGE = 1
       .econst          : > RAMLS2_3_4_5,    PAGE = 1
       .esysmem         : > RAMLS2_3_4_5,    PAGE = 1
    #endif
    
       Filter_RegsFile  : > RAMGS0,    PAGE = 1
    
    
       ramgs0           : > RAMGS0,    PAGE = 1
       ramgs1           : > RAMGS1,    PAGE = 1
    
    #ifdef __TI_COMPILER_VERSION__
       #if __TI_COMPILER_VERSION__ >= 15009000
        .TI.ramfunc : {} > RAMM0,      PAGE = 0
       #else
        ramfuncs    : > RAMM0      PAGE = 0   
       #endif
    #endif
    
       /* The following section definitions are required when using the IPC API Drivers */
        GROUP : > CPU1TOCPU2RAM, PAGE = 1
        {
            PUTBUFFER
            PUTWRITEIDX
            GETREADIDX
        }
    
        GROUP : > CPU2TOCPU1RAM, PAGE = 1
        {
            GETBUFFER :    TYPE = DSECT
            GETWRITEIDX :  TYPE = DSECT
            PUTREADIDX :   TYPE = DSECT
        }
    
        /* The following section definition are for SDFM examples */
       Filter1_RegsFile : > RAMGS1, PAGE = 1, fill=0x1111
       Filter2_RegsFile : > RAMGS2, PAGE = 1, fill=0x2222
       Filter3_RegsFile : > RAMGS3, PAGE = 1, fill=0x3333
       Filter4_RegsFile : > RAMGS4, PAGE = 1, fill=0x4444
       Difference_RegsFile : >RAMGS5,   PAGE = 1, fill=0x3333
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */

    谢谢、
    Sinan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sinan、

    如错误消息中所述 、第0页中没有 RAMLS2_3_4_5。 请在 第0页下添加 RAMLS2_3_4_5定义

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena:

    [引用 userid="487101" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/C2000-microcontrollers-forume/1060114/tms320f28379d-linker-file-memory-range-errors"]我添加了"RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3"]、因为引用的 RAM 段不充分[。

    我不能仅仅添加新的 RAM 分区而不是合并 RAM 块?

    例如:

    .text  : >> RAMD0 |  RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4 | RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3,   PAGE = 0

    当我这么做时、没有发生过这种情况。

    谢谢、
    Sinan。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sinan、

    如果链接器能够将.text 段拆分为较小 的子段、则此操作有效。 默认情况下、可以在文件级别拆分段。 如果打开了 gen_func_subsections、编译器会将每个函数视为单独的子段。 但是、如果单个函数本身大于单个存储器块的大小、链接器无法进一步拆分该大小并在各个存储器块之间分配。 因此、您需要组合存储器块以形成更大的块。

    如果您将  RAMLS2_3_4_5 定义移至第0页、我认为问题应该得到解决。

    实际上、不需要将存储器拆分为 PAGE 0和 PAGE 1。 您可以将所有存储器块保留在 PAGE0本身中。 某些较旧的器件需要使用此功能来分配程序和数据存储器。 对于该器件、这不是强制性要求

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena

    我的问题得到了解决。 我感谢你。

    我稍后将关闭此帖子案例。

    非常感谢您的反馈。

    还感谢 TI E2E 一如既往地提供快速支持。

    祝您度过美好的一天、时刻保持安全。

    Sinan、
    谢谢、致以诚挚的问候。