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.

[参考译文] 编译器/RM57L843:了解映射文件中的.tramp 部分并在 TI ramfunc 部分中放置 RTS 函数调用。

Guru**** 2560390 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/730400/compiler-rm57l843-understanding-tramp-section-in-map-file-and-placing-rts-function-calls-in-ti-ramfunc-section

器件型号:RM57L843

工具/软件:TI C/C++编译器

香榭丽舍

我对我们尝试优化的代码有几个问题。 我已附加了从应用程序构建的 R5二进制文件的映射文件。

e2e.ti.com/.../drv_5F00_gpio_5F00_led_5F00_blink_5F00_app_5F00_tirtos_5F00_mcu1_5F00_0_5F00_release.xer5f.map

在 .TI.ramfunc 部分中,我观察到 trampoline 引用了.tramp 到 TI ARM RTS 库。 它是否指示代码调用了该 RTS 函数 、但未放置在该段中? 关键代码当前放置在 TCM 存储器中。 RTS 函数位于 OCRAM 存储器中。 我是否有办法阻止分支或将这些 RTS 库代码段放置在.TI.ramfunc 中、以避免代价通过缓存转到 SRAM。

此致、

Rahul

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

    从您的映射文件中、我可以告诉您在名为 MCU0_R5F_TCMA 的存储器范围内有一个名为 vary_type_calc_proc1的函  数、该函数在4个不同的站点上调用位于名为 OCMRAM 的存储器范围内的 RTS 函数__aeabi_lmul。  此 RTS 例程执行64位乘法。 (我认为您对我的工作方式不感兴趣。  如果您愿意、我可以介绍这是如何完成的。)

    [引用 user="Rahul Prabhu"]我是否可以阻止分支[/引用]

    [引用 user="Rahul Prabhu"]或将这些 RTS 库代码段放在.TI.ramfunc 中以避免代价[/quot]

    是的。  我将解释如何实现这一点。

    但是、首先、考虑它是否值得。  虽然有4个调用点、但这并未说明调用此 RTS 函数的频率。  它可能被称为很多。  它可能被调用很少。  如果调用次数很少、那么这个优化不太可能值得麻烦。   

    我理解为什么您认为 RTS 函数需要位于同一个部分中。  这不是完全错误的、但它是不精确的。  可以精确地说、调用站点和调用目标之间的内存地址差异不能超过函数调用指令支持的地址。  (很抱歉、我不知道确切的数字。  我认为它大约是1兆字节,或2 **20字节。)  这意味着 RTS 函数不必位于同一个段中、只需在内存中更靠近。  链接器命令文件中可能有一个类似于...的条目。

    .TI.ramfunc > MCU0_R5F_TCMA 

    目的是为所需的 RTS 函数创建另一个输出段、并将其分配到相同的存储器范围。  类似的东西

    rts.ramfunc:
    {
    rtsv7R4_A_le_v3D16_eabi.lib (.text)
    }
    >MCU0_R5F_TCMA
    

    第1行指定输出段的名称。  第3行显示从 RTS 库 rtsv7R4_A_le_v3D16_eabi.lib 中的目标文件 l_mul32.obj 中获取.text (代码)段。  不幸的是、这一行对某些特定于项目的详细信息进行了硬编码。  但这是不可避免的。  必须使用精确的库名称。  语法 ll_mul32*.obj 指示使用以 l_mul32开头并以.obj 结尾的任何目标文件名。  这说明了在16.9.x.LTS 版本中、具有64位乘法例程的文件名为 lL_mul32.obj。  在18.1.0.x.LTS 版本中、该同一文件名为 l_mul32.asm.obj。  第5行将输出段分配到相同的存储器范围。

    有关从 RTS 库分配函数的语法的更多详细信息、请在 ARM 汇编工具手册中搜索 标题 为将库或存档成员指定为输入到输出段的部分。  有关 trampoline 的更多信息、请在同一手册中搜索标题 为 Generate far Call trampoline 的部分。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 George。 这是非常有用的,确实回答了我的问题。

    将 RTS 函数放置在 TCM 存储器中的原因是在不同迭代期间调用该函数大约100次、代码当前位于 OCRAM 存储器中、该存储器通过高速缓存、而不是直接连接到内核的 TCM。

    我进行了此修改、并且看到基准测试的数字确实降低了大约3 μ s (以前为18uec)、因此避免分支到 OCRAM 似乎会产生影响。 感谢您提供解决方案和详细说明。

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

    乔治

    一个后续问题、我们还在映射文件中看到以下内容:

    00004ac0     00000008 (.tramp.sqrt.1)

    不清楚这是链接到 RTS 库。 是否有某种方法可以消除此 trampoline 调用、或者是否有这种方法是作为链接时间优化的一部分生成的、因此我们可以将它们保留在二进制文件中。  

    此致、

    Rahul

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

    我在您附加到您的第一个帖子的映射文件中看不到这一行。  所以、我只能向您提供有关它的一般信息。

    这是由链接器创建的到函数 sqrt 的 trampoline。  如果您搜索地址00004ac0、则最终会点击 far call trampolines 表中的条目、您可以在其中找到有关该条目的更多信息。  包括该 trampoline 的调用站点分支的数量以及这些调用站点的地址。

    [引用 user="Rahul Prabhu"]是否有某种方法可以消除此 trampoline 调用

    是的、但这可能不切实际。  一种方法是在内存中移动内容、使调用站点和调用目标都接近。  另一个是将代码更改为不调用该函数。   

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    明白、谢谢。 现在、将内存移到更近的位置不是一个选项、因此我将暂时保留它。 通过从 R5F 的 TCM 存储器中执行的代码中消除到 RTS 函数的其他 trampoline 会节省5-10%的性能损失、我们最好在调用通过缓存进入 OCRAM 时观察这种情况、因此这确实是对用户有用的信息。


    此致、
    Rahul