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.

[参考译文] TMDSCNCD28379D:程序将不适合可用存储器;修改链接器文件

Guru**** 2506725 points
Other Parts Discussed in Thread: TMDSCNCD28379D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1054390/tmdscncd28379d-program-will-not-fit-into-available-memory-modifying-linker-file

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

您好!

当在针对 CPU2的 TMDSCNCD28379D 的 MATLAB Simulink 中尝试外部模式(从闪存引导)时、我已经在 CPU1上运行了一个不同的应用(从闪存引导)、我收到一个错误消息"程序将不适合可用存储器"

<Linking> 
warning: build attribute vendor section TI missing in 
   "C:/ProgramData/MATLAB/SupportPackages/R2018a/toolbox/target/supportpackages 
   /tic2000/rtlib/IQmath_fpu32.lib<IQ10div.obj>": compatibility cannot be 
   determined 
warning: build attribute vendor section TI missing in 
   "C:/ProgramData/MATLAB/SupportPackages/R2018a/toolbox/target/supportpackages 
   /tic2000/rtlib/IQmath_fpu32.lib<IQmathTables.obj>": compatibility cannot be 
   determined 
"C:/ProgramData/MATLAB/SupportPackages/R2018a/toolbox/target/supportpackages/tic2000/src/c28377D.cmd", line 131: error:  
   program will not fit into available memory.  run placement with 
   alignment/blocking fails for section ".ebss" size 0x8e7 page 1.  Available 
   memory ranges: 
   RAMLS_DATA   size: 0x2000       unused: 0x0          max hole: 0x0 
   RAMD1        size: 0x800        unused: 0x0          max hole: 0x0        
error: errors encountered during linking; "../Inverter_003.out" not built 
 
>> Compilation failure 
gmake: *** [../Inverter_003.out] Error 1 

主要部分是:

RAMLS_DATA 大小:0x2000未使用:0x0最大空洞:0x0
RAMD1大小:0x800未使用:0x0最大孔:0x0

此答复 建议进入链接器文件并向堆区域添加更多段。

当我转到链接器文件 C:\ProgramData\MATLAB SupportPackages\R2018a\toolbox\target\supportpackages/tic2000\src\c28377D.cmd 时

问题1. 我看不到.sysmem、只有.esysmem。 这是问题吗?

.esysmem        :>RAMLS_DATA,   PAGE = 1.

问题2. CPU1只有#ifdef CPU1、CPU2没有。 这是问题吗?

问题3. 我在链接器文件中看不到可作为或("|")添加的可用存储器、仅 RAMLS_DATA。 我应该修改 RAMLS_DATA 吗? 下面是完整的链接器文件

#ifdef CLA_BLOCK_INCLUDED
// Define a size for the CLA scratchpad area that will be used
// by the CLA compiler for local symbols and temps
// Also force references to the special symbols that mark the
// scratchpad are. 
CLA_SCRATCHPAD_SIZE = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=__cla_scratchpad_start
#endif //CLA_BLOCK_INCLUDED
MEMORY
{
PAGE 0 :
   /* BEGIN is used for the "boot to SARAM" bootloader mode   */
   BEGIN           	: origin = 0x000000, length = 0x000002
   BEGIN_FLASH     	: origin = 0x080000, length = 0x000002
   #ifdef CPU1
       RAMM0           	: origin = 0x000122, length = 0x0002DE
   #else
       RAMM0           	: origin = 0x000080, length = 0x000380
   #endif
   RAMD0           	: origin = 0x00B000, length = 0x000800
   #ifdef CLA_BLOCK_INCLUDED
        RAMLS_PROG      	: origin = 0x00A000, length = 0x000800
        RAMLS_CLA_PROG      : origin = 0x00A800, length = 0x000800
   #else
        RAMLS_PROG      	: origin = 0x009000, length = 0x002000
   #endif //CLA_BLOCK_INCLUDED
   #ifdef CPU1       
       #if BOOT_FROM_FLASH
            RAMGS_PROG       : origin = 0x017000, length = 0x001000
       #else
            RAMGS_PROG       : origin = 0x014000, length = 0x004000
       #endif
   #endif

   RESET           	: origin = 0x3FFFC0, length = 0x000002
   /* Flash sectors */
   FLASHA_N           : origin = 0x080002, length = 0x03FFFE	/* on-chip Flash */ 

PAGE 1 :
   #ifdef CPU1
       BOOT_RSVD       : origin = 0x000002, length = 0x000120     /* Part of M0, BOOT rom will use this for stack */
   #else
       BOOT_RSVD       : origin = 0x000002, length = 0x00007E     /* Part of M0, BOOT rom will use this for stack */
   #endif
   RAMM1           : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
   RAMD1           : origin = 0x00B800, length = 0x000800
   #ifdef CLA_BLOCK_INCLUDED
        RAMLS_CLA_DATA      : origin = 0x008000, length = 0x001000
        RAMLS_DATA          : origin = 0x009000, length = 0x002000
   #else
        RAMLS_DATA          : origin = 0x008000, length = 0x002000
   #endif //CLA_BLOCK_INCLUDED
#ifdef CPU1       
       #if BOOT_FROM_FLASH
            RAMGS_DATA       : origin = 0x00E000, length = 0x00B000
       #else
            RAMGS_DATA       : origin = 0x00E000, length = 0x008000
       #endif
#endif
   RAMGS_IPCBuffCPU1   : origin = 0x00C000, length = 0x001000
   RAMGS_IPCBuffCPU2   : origin = 0x00D000, length = 0x001000 

   CLA1_MSGRAMLOW   : origin = 0x001480, length = 0x000080
   CLA1_MSGRAMHIGH  : origin = 0x001500, length = 0x000080

   CPU2TOCPU1RAM   : origin = 0x03F800, length = 0x000400
   CPU1TOCPU2RAM   : origin = 0x03FC00, length = 0x000400
}


SECTIONS
{
#if BOOT_FROM_FLASH
   /* Allocate program areas: */
   .cinit              : > FLASHA_N      PAGE = 0, ALIGN(4)
   .pinit              : > FLASHA_N,     PAGE = 0, ALIGN(4)
   .text               : > FLASHA_N      PAGE = 0, ALIGN(4)
   codestart           : > BEGIN_FLASH       PAGE = 0, ALIGN(4)
   ramfuncs            : LOAD = FLASHA_N,
                         RUN = RAMLS_PROG,
                         LOAD_START(_RamfuncsLoadStart),
                         LOAD_SIZE(_RamfuncsLoadSize),
                         LOAD_END(_RamfuncsLoadEnd),
                         RUN_START(_RamfuncsRunStart),
                         RUN_SIZE(_RamfuncsRunSize),
                         RUN_END(_RamfuncsRunEnd),
                         PAGE = 0, ALIGN(4)
   /* Initalized sections go in Flash */
   .econst             : > FLASHA_N      PAGE = 0, ALIGN(4)
   .switch             : > FLASHA_N      PAGE = 0, ALIGN(4)
   /* Allocate IQmath areas: */
   IQmath			: > FLASHA_N, PAGE = 0, ALIGN(4)            /* Math Code */
   IQmathTables		: > FLASHA_N, PAGE = 0, ALIGN(4)
   
   #ifdef CLA_BLOCK_INCLUDED
       /* CLA specific sections */
       Cla1Prog         : LOAD = FLASHA_N,
                          RUN = RAMLS_CLA_PROG,
                          LOAD_START(_Cla1funcsLoadStart),
                          LOAD_END(_Cla1funcsLoadEnd),
                          RUN_START(_Cla1funcsRunStart),
                          LOAD_SIZE(_Cla1funcsLoadSize),
                          PAGE = 0, ALIGN(4)
   #endif //CLA_BLOCK_INCLUDED
#else
   codestart        : > BEGIN,     PAGE = 0
   ramfuncs         : > RAMM0      PAGE = 0
   #ifdef CPU1
       .text            : >>RAMM0 | RAMD0 | RAMLS_PROG | RAMGS_PROG,   PAGE = 0
   #else
       .text            : >>RAMM0 | RAMD0 | RAMLS_PROG,   PAGE = 0
   #endif
   .cinit           : > RAMM0 | RAMD0 | RAMLS_PROG | RAMGS_PROG,   PAGE = 0
   .pinit           : > RAMM0,     PAGE = 0
   .switch          : > RAMM0,     PAGE = 0
   .econst          : > RAMLS_DATA,    PAGE = 1
   /* Allocate IQ math areas: */
   IQmath			: > RAMLS_PROG,     PAGE = 0            /* Math Code */
   IQmathTables		: > RAMLS_PROG, PAGE = 0

   #ifdef CLA_BLOCK_INCLUDED
       /* CLA specific sections */
       Cla1Prog         : > RAMLS_CLA_PROG, PAGE=0
   #endif //CLA_BLOCK_INCLUDED
#endif
   .stack           : > RAMM1,     PAGE = 1
   #ifdef CPU1
       .ebss            : >> RAMLS_DATA| RAMD1 | RAMGS_DATA ,    PAGE = 1
   #else
       .ebss            : >> RAMLS_DATA| RAMD1,    PAGE = 1
   #endif
   .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */
   .esysmem         : > RAMLS_DATA,    PAGE = 1
   
   #ifdef CLA_BLOCK_INCLUDED
       /* CLA C compiler sections */
       //
       // Must be allocated to memory the CLA has write access to
       //
       Cla1DataRam0		: > RAMLS_CLA_DATA, PAGE=1

       Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW,   PAGE = 1
       CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH,  PAGE = 1
       CLAscratch       :
                         { *.obj(CLAscratch)
                         . += CLA_SCRATCHPAD_SIZE;
                         *.obj(CLAscratch_end) } >  RAMLS_CLA_DATA,  PAGE = 1

       .scratchpad      : > RAMLS_CLA_DATA,       PAGE = 1
       .bss_cla		    : > RAMLS_CLA_DATA,       PAGE = 1
       .const_cla	    :  LOAD = FLASHA_N,
                           RUN = RAMLS_CLA_DATA,
                           RUN_START(_Cla1ConstRunStart),
                           LOAD_START(_Cla1ConstLoadStart),
                           LOAD_SIZE(_Cla1ConstLoadSize),
                           PAGE = 1
   #endif //CLA_BLOCK_INCLUDED
   #ifdef CPU1  
       /* The following section definitions are required when using the IPC API Drivers */ 
        GROUP : > CPU1TOCPU2RAM, PAGE = 1 
        {
            PUTBUFFER 
            PUTWRITEIDX 
            GETREADIDX 
            WRITEFLAG1CPU1
	    WRITEFLAG2CPU1
            READFLAG1CPU1
            READFLAG2CPU1
        }
        GROUP : > CPU2TOCPU1RAM, PAGE = 1
        {
            GETBUFFER :    TYPE = DSECT
            GETWRITEIDX :  TYPE = DSECT
            PUTREADIDX :   TYPE = DSECT
            WRITEFLAG1CPU2: TYPE = DSECT
            WRITEFLAG2CPU2: TYPE = DSECT
            READFLAG1CPU2:  TYPE = DSECT
            READFLAG2CPU2:  TYPE = DSECT
        }

   #else
       /* The following section definitions are required when using the IPC API Drivers */ 
        GROUP : > CPU2TOCPU1RAM, PAGE = 1 
        {
            PUTBUFFER 
            PUTWRITEIDX 
            GETREADIDX 
            WRITEFLAG1CPU2
            WRITEFLAG2CPU2
            READFLAG1CPU2			
            READFLAG2CPU2			
        }
        GROUP : > CPU1TOCPU2RAM, PAGE = 1
        {
            GETBUFFER :    TYPE = DSECT
            GETWRITEIDX :  TYPE = DSECT
            PUTREADIDX :   TYPE = DSECT
            WRITEFLAG1CPU1: TYPE = DSECT
            WRITEFLAG2CPU1: TYPE = DSECT
            READFLAG1CPU1 : TYPE = DSECT
            READFLAG2CPU1 : TYPE = DSECT
        }
   #endif 
        GROUP : > RAMGS_IPCBuffCPU1, PAGE = 1 
        {
            CPU1TOCPU2GSRAM
        }
        GROUP : > RAMGS_IPCBuffCPU2, PAGE = 1 
        {
            CPU2TOCPU1GSRAM
        }
}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

 个月前、我问了一个类似的问题、因为我遇到了相同的错误("程序将无法放入可用存储器")、我假设通过 MATLAB Simulink 增大堆大小可以解决这个问题。 它暂时确实如此,但现在我仍有同样的问题。

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

    您好!

    [引用 userid="270650" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1054390/tmdscncd28379d-program-will-not-fit-into-available-memory-modifying-linker-file "]

    问题1. 我看不到.sysmem、只有.esysmem。 这是问题吗?

    .esysmem        :>RAMLS_DATA,   PAGE = 1.

    [/报价]

    看起来您使用的是 COFF 格式、因此.esysmem 是等效段。

    [引用 userid="270650" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1054390/tmdscncd28379d-program-will-not-fit-into-available-memory-modifying-linker-file ]Q2。 CPU1只有#ifdef CPU1、CPU2没有。 这是否是问题?

    这不应该是任何问题。  如果不是 CPU2的 CPU1块。

    [引用 userid="270650" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1054390/tmdscncd28379d-program-will-not-fit-into-available-memory-modifying-linker-file "]我看不到可用作或("|")添加到链接器文件中的可用存储器、只有 RAMLS_DATA。 我是否应该修改 RAMLS_DATA[/QUERPLET]

    是否包含 CLA_BLOCK_INDED? 如果不是、则可以包含 RAMLS_DATA 小位。

    此链接器文件随 Simulink 项目提供还是为您的项目创建?

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

    您好、Santosh、

    链接器文件随 MATLAB 网站上用于 C2000安装的 Simulink 支持包一起提供。 我没有看到 F28379D (我正在使用的处理器)、因此"最近的"是 c28377D.cmd。 在 Simulink 中、我已设置该文件的链接器命令文件路径。 是否有用于 F28379D 的特定链接器文件可供下载?

    在我的第一条消息中有一个 CLA_block_included 行#136显示了完整的链接器文件。

    链接器文件中的第50行和第52行、假设

    RAMLS_DATA:origin = 0x009000,length = 0x002000 (#50)

    RAMLS_DATA:origin = 0x008000、length = 0x002000 (#52)

    解决方案是增加长度吗? 可以这样做吗? 多少钱?

    对于 F28377D (与 F28379D 处理器类似) 、它说 有"128KB GSX RAM (16块8KB)"。 现在、确定如何将长度0x002000转换为 KB、并检查我是否还有剩余空间。

    MATLAB Simulink 报告显示

    RAMLS_DATA 大小:0x2000未使用:0x0

    这意味着使用了所有2000。

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

    您好、Santosh、

    新更新。 当我在 CPU1外部模式下加载应用程序(例如机器端应用程序)以进行测试和参数调整时、以及在 CPU2 (非 外部模式)上已测试的另一个应用程序(例如网络端应用程序)时、我没有收到错误。

    但是、我遇到了另一个问题。 我在应用中看不到任何变化:虽然有一个1.5 Vdc 的输入(用于容纳单极 ADC 输入的交流信号的偏移)和 GPIO 切换信号我必须验证采样时间(10kHz)始终为高电平、但我的 ADC 为零。

    我之前使用过 F28335,并且能够运行类似的代码(一个 CPU 上的网络和机器应用程序-- F28335只有一个 CPU)。 F28379D 具有两个 CPU 和更多内存。

    增大 RAM 长度是否有用?是否可以添加更多 RAM 位置? 我的成绩是否正确?

    当我执行此操作或在所有 RAM 之间执行此操作时、我将得到0x002200 + 0x000800 + 0x004000、即0x007000字节、而 F28739D 的内存为1024KB ... 我是否正确添加了所有这些内容?

    .esysmem        :> RAMLS_DATA | RAMD1 | RAMGS_DATA

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

    Mike、

    我不熟悉这些应用、因此我们需要 MathWorks 团队的帮助。 我将与 MW 团队联系、在这里为我们提供帮助。

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

    不、不、抱歉、我在这里添加了一定程度的混淆。 它们是我定制的 Simulink 应用、用于控制网络(加载到 CPU1)和机器(加载到 CPU2)转换器。 每个模块都有 ADC 部分、调节和滤波、双环路控制和 PWM 模块。

    e2e.ti.com/.../NWandMCApp.zip

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

    我稍微修改了 ADC 模块并更改了采集窗口、现在可以了。 我正在从零开始逐步重新构建应用程序代码、在我执行操作时编译和加载代码、检查是否存在超支等、到目前为止一切都正常。

    BTW。 是否有专门针对 F28379D 的链接器文件、且所有 RAM 均已正确分配?

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

    Mike、

    很抱歉、我们这边的延迟、上周我们很多人都外出了、我正在跟踪 Santosh 的线程。  

    在扩展集.cmd 文件中、我将从此处开始 C:\ti\c2000Ware_4_00_00_00\device_support\f2837xd\con\cmd\ch2837xD_flash_lnk_cpu1.cmd

    根据先前的帖子、我认为即使您使用"|"运算符加入多个 RAM、链接器错误也可能会持续存在。  如果有一个函数跨越定义的 RAM 的定义边界、并且链接器将报告大小为0、则会发生这种情况。

    如果情况仍然如此、您需要手动将 RAM 与更长的长度组合在一起(我想您在前面已经提到过)。  您可以执行此操作、以使连续块的大小与特定段所需的大小相同。

    让我知道这是在正确的轨道上、还是我需要做更多挖掘。

    最棒的

    Matthew