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.

[参考译文] TMS320F280039C:CLA 程序不适合 RAM

Guru**** 2524550 points
Other Parts Discussed in Thread: C2000WARE, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1414204/tms320f280039c-cla-program-does-not-fit-into-ram

器件型号:TMS320F280039C
主题中讨论的其他器件:C2000WARESysConfig

工具与软件:

您好!

我将使用 CLA 读取两个 SPI 编码器、到目前为止运行良好。 并非必须添加一些校准例程、代码增长越来越快、我现在正处于使用总共4个 RAM LS 组(3个用于程序、1个用于数据)的情况、但这似乎不可行、我总是会收到以下编译器错误:  

 "程序将无法放入可用的存储器中、或者该段包含的调用站点需要无法为此段生成 trampoline。 对于"Cla1Prog"大小0x10dc 第0页、加载对齐/分块的放置失败。  可用内存范围"

现在我不明白这个问题、因为我可以成功地将 RAMLS1和 RAMLS2合并到一个更大的银行、但似乎没有这个问题、我无法将 LS1-LS3合并到一个银行。

f28003x_flash_lib_is:

...

    RAMLS012               	  : origin = 0x008000, length = 0x001800
    RAMLS3               	  : origin = 0x009800, length = 0x000800

    RAMLSnP                   : origin = 0x00A000, length = 0x002000
    RAMGSnP                   : origin = 0x00C000, length = 0x001000
    RAMGSC                    : origin = 0x00D000, length = 0x001000
    RAMGSF                    : origin = 0x00E000, length = 0x001000
    RAMGSD                    : origin = 0x00F000, length = 0x000FF8
    
...

    // CLA Sections

#if defined(__TI_EABI__)
    /* CLA specific sections */
    Cla1Prog        : LOAD = FLASHBANK1_CLA,
                      RUN = RAMLS012,
                      LOAD_START(Cla1ProgLoadStart),
                      RUN_START(Cla1ProgRunStart),
                      LOAD_SIZE(Cla1ProgLoadSize),
                      ALIGN(8)

    .const_cla      : LOAD = FLASHBANK1_CLA,
                      RUN = RAMLS3,
                      RUN_START(Cla1ConstRunStart),
                      LOAD_START(Cla1ConstLoadStart),
                      LOAD_SIZE(Cla1ConstLoadSize),
                      ALIGN(8)
#else
    /* CLA specific sections */
    Cla1Prog        : LOAD = FLASHBANK1_CLA,
                      RUN = RAMLS012,
                      LOAD_START(_Cla1ProgLoadStart),
                      RUN_START(_Cla1ProgRunStart),
                      LOAD_SIZE(_Cla1ProgLoadSize),
                      ALIGN(8)

    .const_cla      : LOAD = FLASHBANK1_CLA,
                      RUN = RAMLS3,
                      RUN_START(_Cla1ConstRunStart),
                      LOAD_START(_Cla1ConstLoadStart),
                      LOAD_SIZE(_Cla1ConstLoadSize),
                      ALIGN(8)
#endif

    .scratchpad      : > RAMLS3
    .bss_cla         : > RAMLS3
    Cla1DataRam      : > RAMLS3 //RAMLS3
    cla_shared       : > RAMLS3
    CLADataLS1       : > RAMLS3

    Cla1ToCpuMsgRAM  : > CLATOCPU_MSGRAM
    CpuToCla1MsgRAM  : > CPUTOCLA_MSGRAM

用于 CLA 的 INIT:

void MEMCFG_init()
{
    //
    // Initialize RAMs
    //
    MemCfg_initSections(MEMCFG_SECT_MSGCPUTOCLA1);
    MemCfg_initSections(MEMCFG_SECT_MSGCLA1TOCPU);
    while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCPUTOCLA1));
    while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCLA1TOCPU));
    //
    // Configure LSRAMs
    //
    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMCONTROLLER_CPU_CLA1); //LS0 - LS2 needs to be for CLA --> Change in flash.cmd file
    MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_PROGRAM);
    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMCONTROLLER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_PROGRAM);
    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS2, MEMCFG_LSRAMCONTROLLER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS2, MEMCFG_CLA_MEM_PROGRAM);
    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS3, MEMCFG_LSRAMCONTROLLER_CPU_CLA1);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS3, MEMCFG_CLA_MEM_DATA);

    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS4, MEMCFG_LSRAMCONTROLLER_CPU_ONLY);
    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS5, MEMCFG_LSRAMCONTROLLER_CPU_ONLY);
    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS6, MEMCFG_LSRAMCONTROLLER_CPU_ONLY);
    MemCfg_setLSRAMControllerSel(MEMCFG_SECT_LS7, MEMCFG_LSRAMCONTROLLER_CPU_ONLY);

    // Lock/Commit Registers
    //
    //
    // Enable Access Violation Interrupt
    //
    //
    // Correctable error Interrupt
    //
    MemCfg_setCorrErrorThreshold(0);
    MemCfg_disableCorrErrorInterrupt(MEMCFG_CERR_CPUREAD);
}

有什么想法、为什么这样做不起作用? 我还激活了编译器 选项"--gen_func_subsections = on"、但没有成功。

编辑:  我找到了解决方法、但我不确定折衷方案是什么。 当我使用以下命令时、它是有效的:

计算结果:

	Cla1Prog      	 : >> RAMLS012
	.const_cla		 : > RAMLS3

不起作用:

    // CLA specific sections
    Cla1Prog        : LOAD = FLASHBANK1_CLA,
                      RUN = RAMLS012,
                      LOAD_START(_Cla1ProgLoadStart),
                      RUN_START(_Cla1ProgRunStart),
                      LOAD_SIZE(_Cla1ProgLoadSize),
                      ALIGN(8)

    .const_cla      : LOAD = FLASHBANK1_CLA,
                      RUN = RAMLS3,
                      RUN_START(_Cla1ConstRunStart),
                      LOAD_START(_Cla1ConstLoadStart),
                      LOAD_SIZE(_Cla1ConstLoadSize),
                      ALIGN(8)

那么、如果不使用 lfash 银行加载程序、会有什么折衷呢? 这是否会以某种方式导致问题?

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

    尊敬的 Hans:

    我有几个澄清问题:

    1. 您是否使用 C2000ware 中的链接器 cmd 文件作为起点? 如果是、您对其进行了哪些编辑?
    2. 您是否正在运行程序的闪存或 RAM 构建?
    3. 如果使用闪存构建、是否要确保在 C28x 代码中将 CLA 程序复制到 LSRAM 中、如下所示:
    4. 是否使用 SysConfig 生成 CLA 初始化代码和/或链接器 cmd 文件?

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您的回应。 我现在可以解决这个问题了。 问题是、FLASHBANK1_CLA 段不够大。

    谢谢!

    Hans

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

    尊敬的 Hans:

    很高兴听到您能够解决此问题。 然后、我将关闭该主题、如果您有任何其他问题、可以随时创建另一个主题。

    此致、

    Delaney