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/TMS320F28377S:程序不适用于可用存储器。

Guru**** 2462980 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/652396/ccs-tms320f28377s-program-not-fitting-into-available-memory

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

我遇到以下错误:


"./28377S_RAM_lnk.cmd"、第58行:错误#10099-D:程序不能放入可用内存中。 ".cinit"大小为0x2e1第0页的对齐/分块放置失败。 可用存储器范围:
RAMM0大小:0x2DE 未使用:0x0最大空洞:0x0
错误#10010:链接期间遇到错误;未生成"VC_SCIM.OUT"

我进行了以下更改:

RAMM0       :origin = 0x000122、length = 0x0012DE //0x0002DE 至  0x0012DE

我遇到以下错误:

C28xx_CPU1:GEL 输出:  

内存映射初始化完成
C28xx_CPU1:加载程序:程序的一个或多个部分属于不可写的存储器区域。 这些区域实际上不会写入目标。 检查链接器配置和/或存储器映射。

我需要在代码中编写更多算法、因此需要更多空间。

有什么建议吗?

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

    您正朝着修改链接器文件的方向前进、但您必须与器件上的可用存储器保持一致。 请通读链接器命令文件 Wiki 页面。
    processors.wiki.ti.com/.../Linker_Command_File_Primer

    您还需要查阅器件存储器映射、以确保您正在合并/修改映射以与可用的映射保持一致。

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

    谢谢你。
    我在这些方面没有太多背景。 在哪里可以找到器件上的可用存储器。
    请指导我如何执行这些操作。

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

    器件的存储器映射可在数据表中找到。
    www.ti.com/.../detailed-description -第6.3节内存

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

    我尝试将链接器文件修改为:

     RAMM0       :origin = 0x000122、length = 0x0002DE        更改为        0x0003DE   

    但是、当我单击"运行"时、它会生成一个错误

    "0x3fe493"无源可用

    存储器映射提供了有关 RAMM0的以下信息:

    M0 RAM       1K×16        0x0000 0000        0x0000 03FF

    请告诉我如何继续。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Shyam、
    您是否正在尝试运行根据您的需求修改的 TI 提供的示例? 在增加链接器命令文件中存储器段的大小以适应程序段时、必须小心谨慎。 首先、您必须检查存储器范围是否可用、并且 Mark 指向的器件存储器映射将有助于实现这一点;其次、您必须确保存储器范围(起始地址+长度)不会与另一个段重叠。

    希望您从 TI 提供的示例开始、并将相关的 TI 提供的链接器命令文件作为参考、现在如果您的.cinit 无法放入可用的 M0 RAM 中、您所做的是增加 M0 RAM、但它是否与 M1 RAM 重叠? 您未提供完整的链接器命令文件、因此我无法准确判断出什么是错误的。

    通常适合程序段
    >您可以将链接段移动到链接器命令文件中定义的较大存储器段、例如:您可以将.cinit 移动到 L0 RAM 或 L1 RAM 等


    >您可以通过修改链接器命令文件将两个 RAM 段组合成一个段,就像对于每个 LX RAM,不需要输入长度为0x1000的条目一样,您可以执行长度为0x2000的 L0L1 RAM 并在此处链接您的程序段。 我在这里给出了一个示例、您必须查看器件数据表存储器映射、以查看可用的 RAM。

    查看 C2000编译器参考手册,第4.3.6节介绍了如何将段分配到内存。
    www.ti.com/.../spru514o.pdf

    另请参阅汇编语言工具指南第2.3节和第2.4节
    www.ti.com/.../spru513o.pdf

    如果您具有任何其他 MCU 的嵌入式软件开发经验、这应该与您已经了解的内容类似。

    在另一个问题“没有可用于“0x3fe493”的源,此位置是指设备引导 ROM。 请查看器件 TRM 第3.9.2节的器件引导 ROM 一章、表3-11。 根据该表、您的应用看起来像是在 iTRAP ISR 中结束的、这意味着存在非法的指令提取、这很可能是因为您的链接器命令文件不正确。 这可能是因为我上面提到的一点之一。

    希望这对您有所帮助。

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

    谢谢。 我在这些方面没有太多背景。


    存储器

    第0页:
    /* begin 用于"引导至 SARAM"引导加载程序模式*/

    开始:origin = 0x000000,length = 0x000002
    RAMM0:origin = 0x000122、length = 0x0002DE
    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
    RAMGS14:origin = 0x01A000,length = 0x001000
    RAMGS15:origin = 0x01B000,length = 0x001000
    复位:origin = 0x3FFFC0,length = 0x000002

    第1页:

    BOOT_RSVD:origin = 0x000002,length = 0x000120 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
    RAMD1:origin = 0x00B800,length = 0x000800


    RAMLS5:origin = 0x00A800,length = 0x000800

    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 = 0x001000
    RAMGS12:origin = 0x018000,length = 0x001000
    RAMGS13:origin = 0x019000,length = 0x001000


    部分

    codestart:> begin,page = 0
    ramfuncs:>RAMM0 page = 0

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    .TI.ramfunc:{}> RAMM0,PAGE = 0
    #endif
    #endif

    .text:>>RAMM0 | RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4,page = 0
    .cinit:> RAMM0,page = 0
    .pinit:> RAMM0,page = 0
    switch:>RAMM0,page = 0
    .reset:> reset,page = 0,type = DSECT //未使用,*/

    .stack:>RAMM1,PAGE = 1.
    .ebss:> RAMLS5,PAGE = 1.
    econst:> RAMLS5,page = 1.
    .esysmem:> RAMLS5,page = 1.

    RAMS0:>RAMGS0,PAGE = 1
    ramgs1:>RAMGS1,page = 1.

    /*
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *

    请告诉我应该怎么做、这样我就可以编写更多的算法、而不会再次遇到这个问题。

    再次感谢!!

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

    另请参阅以下链接、Mark 在其上述建议中也提到了这一点。 下面的 wiki 介绍了如何分配到多个存储器范围或如何在多个存储器范围之间拆分段。

    processors.wiki.ti.com/.../Linker_Command_File_Primer

    此致
    Santosh Athuru

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    链接器命令文件对我来说很好、如果您无法容纳.cinit、请尝试将.cinit 分配到 RAMLS5、而不是 RAMM0?

    如果不起作用、请检查生成的存储器映射(*。map 文件)文件、以查看是否未使用 LS0至 LS4中的任何一个、并将该存储器移至第1页、然后将.cinit 链接至该页。

    随着应用的发展、您可以查看是否可以将代码链接到闪存、这将释放 RAM 的使用。

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

    谢谢。

    我发现我可以增加代码的主体而不会遇到这个问题、但是一旦我声明一些变量、就会弹出这个内存问题。

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

    Shyam、

    正如我在上面的帖子中提到的、只需将无法放入可用存储器的段的链接移动到更大的 RAM 段。 我不确定您是否理解上述建议的解决方案。  

    请告诉我们我们是否可以提供进一步的帮助。

    此致

    Santosh Athuru

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

    请举一个例子。 我一直在努力,但没有取得任何成功。

    此致、

    R Nair

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

    您是否仍然收到与.cinit 不匹配在可用存储器中相同的错误?
    也许您可以看看 CCS 内的内存分配工具。 如果您使用的是 CCSv7、则位于列表底部附近的 View->Memory Allocation 中。 它将为您提供构建后内存使用位置的可视化信息。 它将显示出现错误时无法放置的段。 实际上、您可以将大多数段放在存储器空间的任何位置。

    例如、您可以查看 Delfino F28379D 多日技术讲座。 实验练习2专门讨论链接器命令文件。
    processors.wiki.ti.com/.../C2000_Multi-Day_Workshop

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

    自您上次答复以来已经有几天了。 您是否仍在处理此问题? 我要将此帖子标记为已关闭。 如果您有其他问题、请告知我们。

    谢谢、
    标记