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.

[参考译文] TMS320F28032:如何将运行在 RAM 中的程序加载到两个不连续的 RAM 空间?

Guru**** 2513185 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1125009/tms320f28032-how-can-i-load-a-program-running-in-ram-into-two-non-contiguous-ram-space

器件型号:TMS320F28032

在我们的项目中、中断程序在 RAM 中运行、但当前单个 RAM 空间的内存不足、我们需要组合2个 RAM 空间来填充程序、但 CCS 似乎阻止了我的多 RAM 空间组合

我应该怎么做才能实现我的目标?以上只是一个例子,tks

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

    在.cmd 文件中、您可以手动将 RAM 文件合并为一个连续空间、如下所示:

    RAML0L1:origin = 0x008000、length = 0x001000

    然后将运行分配给新的统一 RAML0L1。

    最棒的

    Matthew

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

    抱歉、我们无法执行此操作、因为在我们的大规模生产产品中、中间 RAM 空间已在用户的引导区域中使用、无法更改、因此无法手动合并两个 RAM 空间。 是否可以为 ISR 操作组合两个非连续 RAM 空间?

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

    我认为问题是、如果某个段像您在原始帖子中看到的那样跨越存储器联合体、链接器会引发此错误。  

    您需要将代码分解为不同的代码段、以便链接器可以将它们放置在不同的 RAM 区域中。  这是否可以在您的项目中实现?  

    因此、您需要尝试将要从 RAM 执行的代码划分为多个代码段、而不是一个"ramfuncs"代码段/pragma。

    为了确保这一切都适用、即使您不能使用连续区域、也可能会制作与您拥有的 RAM 总大小相同的"假"存储器部分、以确保在您开始分解之前它适用。

    最棒的

    Matthew

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

    谢谢!  我了解您所讨论的方法,我们也考虑了您的想法、但我们不能这么做、因为正在运行的程序是一个中断程序。 如果中断程序被分成多个函数、函数调用的效率将非常低。 目前、我们有一个用于整个中断代码的函数。
    我想知道在 CMD 文件配置方面是否有办法实现这一点

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

    我将在 SW 侧与其他几位同事一起查看我们是否有不涉及手动移动内容的 CMD 解决方案。

    最棒的

    Matthew

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

    尝试添加以下编译选项:-gen_func_subsections  这将分解您的现有函数、以便它们可以跨联合体展开。

    最棒的

    Matthew

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

    似乎不起作用,cmd 文件中的“run”命令似乎不支持“|”的语法,我们需要在非连续 RAM 空间中运行,闪存正常

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

    您能否对编译器中的优化设置进行评论、并让我知道您在项目中包含哪些(如果有)库?

    具体而言、您的项目是否包括闪存 API 库?  有一个选项可将此文件链接至 ROM (已由 TI 编程)以节省空间。

    此时、我将尝试查看我们是否可以减少整体代码占用空间、因为我认为我们没有任何其他选项可以尝试重新分配内容。

    您能否为我附加完整的.cmd 文件以检查分配?

    最棒的

    Matthew

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

    好的、我们只是想知道是否有办法在 CMD 文件配置级别解决这个问题、因为无法"运行"到2个非连续区域、所以我们尝试优化代码。谢谢

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

    Foriner、

    我从我们的工具团队那里获得了有关上述内容的更多信息。  我们似乎需要将 run 语句更改为(replace = with >>):

    运行>> RAML0 | RAML1

    这将使链接器跨越该函数。

    但是、这将导致一个新问题、这是因为函数在连续假设下运行、所以该函数从闪存复制到 RAM。

    为了解决此问题、我们需要创建复制表、而不是使用符号。 那么、现在我们有了

    .TI.ramfunc    : load = FLASHH,

                              运行>> RAML0 | RAML1

                              表(BINIT)

                              PAGE = 0

     .binit > FLASHH

    此"binIT"部分将由 RTS 库在 main 之前处理并正确复制内容。  请告诉我这是否有任何问题。

    最棒的

    Matthew