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.

[参考译文] CCS/TMS320F28377D:需要.TI.ramfunc 的存储器映射/链接器帮助

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/691117/ccs-tms320f28377d-need-memory-map-linker-help-for-ti-ramfunc

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

我一直在调试一些运行在 RAM 之外的时间关键型代码、现在当我耗尽闪存时、我会有一些性能下降(SYSCLK= 150MHz、闪存等待状态= 2)。  因此、我一直在使用#pragma CODE_SECTION ( ,".TI.ramfunc");  

在我这么做时、链接器会通知我、我没有一个足够大的连续存储器块、可以容纳我尝试使用此指令放入 RAM 中的所有内容。

"C:/Users/sbeiter/workspace_v7/my_project/2837xD_FLASH_lnk_cpu1.cmd "、第93行:错误#10099-D:程序不能放入可用内存中。 对".TI.ramfunc"大小为0x108f 页0的运行定位/分块失败。 可用存储器范围:
RAMLS0大小:0x800未使用:0x800最大孔:0x800
RAMLS1大小:0x800未使用:0x800最大孔:0x800
RAMLS2大小:0x800未使用:0x800最大孔:0x800
RAMLS3大小:0x800未使用:0x800最大孔:0x800
RAMGS14大小:0x1000未使用:0x1000最大孔:0x1000
RAMGS15大小:0x1000未使用:0x1000最大孔:0x1000

返回0x0800时、我已经通过将 GS14和 GS15包含在可用 RAM 空间中来修改了提供的链接器命令文件:

 .TI.ramfunc:{}负载= FLASHD,
      RUN = RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3|RAMGS14|RAMGS15、
                        load_start (_RamfuncsLoadStart)、
                        load_size (_RamfuncsLoadSize)、
                        load_end (_RamfuncsLoadEnd)、
                        run_start (_RamfuncsRunStart)、
                        run_size (_RamfuncsRunSize)、
                        run_end (_RamfuncsRunEnd)、
      PAGE = 0、ALIGN (4)

我想我不确定链接器为什么要寻找一个连续块、以及它为什么不能识别 LS0到 LS3的邻接关系、这实际上代表了0x800 x 4?  是否有将这些块串联在一起的语法?  我想我可以使 RAMLS0看起来像一个4 x 0x800的连续块、但是否有一 种首选或推荐的方法、而不是这种方法、或者为程序获取更大的 RAM 块?  我还可以声明第二个.TI.ramfunc2段或其他内容、但我想尽可能按照 TI 建议的方式来执行此操作。  显然、这里有大量的内存、只需确保我正确使用了链接器命令文件功能。  谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    就我所能说的、无法在内存区域中拆分运行段。 我将对代码生成团队进行 ping 操作、但我怀疑您需要像您提到的那样组合一些块。 类似的东西

    RAMLS0_3:origin = 0x008000、length = 0x002000

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

    谢谢、Whitney。  在您进行检查时、我可以询问后续行动吗?  我很好奇、因为用于 RAM 编译的链接器命令文件似乎并不关心我的代码跨多个 RAM 的0x800 "扇区"、那么为什么闪存编译呢?  我的意思是、当我将 RAM 构建到 RAMLS0到 RAMLS3的同一空间中时、它不会遇到类似的错误?

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

    我建议  将存储器范围 RAMLS0至 RAMLS3折叠到一个存储器范围中。  这涉及两个更改。

    首先,在 MEMORY 指令中,这...

    RAMLS0:origin = 0x008000、length = 0x000800
    RAMLS1:origin = 0x008800,length = 0x000800
    RAMLS2:origin = 0x009000、length = 0x000800
    RAMLS3:origin = 0x009800,length = 0x000800
    

    (笑声) 更改为...

    RAMLS0_LS3 :origin = 0x008000、length = 0x000800 * 4.
    

    其次、在 SECTIONS 指令中、必须将存储器范围名称 RAMLS0到 RAMLS3的任何使用更改为使用 RAMLS0_LS3。  所以...

    RUN = RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3、
    

    (笑声) 变为...

    运行= RAMLS0_LS3
    

    背景... 语法...

    [引用用户="Susan Beiter78"]      运行= RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3|RAMGS14|RAMGS15、[/QUERPES]

    (笑声) 意味着将名为.TI.ramfunc 的整个输出段分配到列表中可以包含该段的第一个存储器范围中。  仅选择一个存储器范围。  其余未使用。  一旦.TI.ramfunc 大于最大的存储器范围、分配就会失败。

    将这些存储器范围折叠到一个存储器范围会创建更大的存储器范围、可以在其中分配更多函数。

    至于分割运行地址... 这很有可能。  但是、除了更改链接器命令文件外、还必须更改系统启动代码。  我怀疑您不想详细介绍这方面的内容。

    谢谢、此致、

    乔治