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/TMS320F28374D:使用&quot 的内联问题;big"代码

Guru**** 2430620 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/612987/ccs-tms320f28374d-inlining-issue-using-big-code

器件型号:TMS320F28374D

工具/软件:Code Composer Studio

大家好,  

请访问 Soprano F28374D 和 CCS6.4.10 (由于项目启动,我无法移动,并且必须冻结编译器)。

现在 我 需要  内联函数 , 它运行得非常好 ,但 在添加 代码和代码(例如,它们到达内部的2000行,例如中断函数 )后   ,内联 不再起作用:这会影响 产品 性能。  

很容易检查添加 代码和代码,CCS 会将一些函数保留在外,当代码较大时,函数就越多  

在 Attach 中,您有编译器设置,我还尝试了其他编译器优化级别,没有解决方案  

请我做什么库仑?  是否有权变措施? 我怎么了?

谢谢你

再见

卡洛

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    内联是一个棘手的问题。 优化器会限制函数内联的大小、这样您就不会遇到编译器花费指数级长的时间进行编译的问题。

    通常、您根本不能内联中断处理程序函数;您是否真的要内联处理程序本身或处理程序调用的函数?

    是否已将要内联的函数声明为"内联"?

    另请参阅:

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

    考古学家感谢您的回答。

    我尝试内联  处理程序调用的几个函数。 当然、我要内联的所有函数都是内联声明的。 我还知道存在能够完美工作的 pragma #always_inline (function)。

    问题与我必须内联的函数的长度无关、而与我在中断处理程序中拥有的代码的长度无关:如果代码行的数量超过、在某些情况下、函数之前被内联、那么就不再被内联: 文件似乎存在代码行限制:超过此限制后、无法再确保内联。 我将讨论行代码限制、因为 A = 0等简单的表示法会有所不同。

    Carlo 向我报告了这个问题、他还有两个不同的项目提出了这个问题。

    您是否知道编译器是否有代码行限制来决定是否内联:?

    再次感谢你   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否、没有线路限制。 对于 C2000、对于声明为内联的函数、存在任意大小限制以避免编译器被中止;
    当--opt_for_speed 为0或1时,该值小于其他值时的值。 对行为没有精确的控制。
    但我不希望它取决于调用方的大小、仅取决于被调用方(及其 callees 等)。
    如果您可以安全使用、最好的替代方法可能是 always-inline pragma。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您想获得特定于您情况的建议、请向我们发送一些源代码、如文章 How to Submit a Compiler Test Case 中所述。  此外、请告诉我们您希望内联但不希望内联的一些函数的名称。

    谢谢、此致、

    乔治

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

    尊敬的乔治:  

    请链接您建议 的是“关闭”、 “检查”或“脱机发送我”程序?

    情况紧急  

    谢谢你  

    再见

    卡洛

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

    链路未关闭、只是错误。  我不知道这是怎么发生的。  我已经编辑并修复了该帖子。  同样、以下是完整地址:    

    谢谢、此致、

    乔治

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

    感谢您提交测试案例。  这个比大多数人都要棘手。  我可以重现问题。  这不是编译器中的错误。  也就是说、生成的代码是正确的。  但这是一个性能问题。  生成的代码的运行速度比所需速度慢。  我在 SDOWP 系统中提交了 CodeGen-3594、以进行调查。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我错了,我是对的。 测试用例遇到了其中一个任意限制、而重要的是调用方的大小。 有700个基本块的任意限制--内联不会创建大于该值的函数。

    可以合理地断言 C2000内联不应使用该特定限制、因为这是某些重构的意外影响、事实上版本6.0.x 和更早版本没有该限制。 这可能是我要选择的解决方案。

    (如何选择700? 通过一系列测试和应用、我改变了一些内联参数并绘制了编译时间和空间。 700是其中一些人开始变得非常超线性的地方。 但是、我们当然可以认为、该限制应根据目标进行更具体的调整。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    早上好、George、
    首先、感谢您的观看。 我怀疑与代码长度增加的程度越相似、实际内联的函数就越少。

    好的、George、在列表中、我们有两个解决方案:
    1) 1)我们拼尽全力编写非常长的函数、如果情况如此、因为我们的应用需要、那么我们可以选择一个异常值的编译器版本
    2)使用 pragma always_inline(),即使是长代码也有效。

    只是最后一个问题:您认为下一个编译器版本中的限制将被删除、还是将被人为删除?

    再次感谢您、
    此致、
    Andrea Marcianesi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在17.9.0版本中,我没有看到任何障碍物可以将其卸下。 我怀疑我们会在6.4.x 系列中删除它、因为我们不再支持该分支机构、但这是我的主管的电话(他已经离开了一周左右)。

    但是:不能保证编译器将继续以相同的方式内联函数。 C2000编译器当前内联对函数的所有调用、或不对函数的所有调用(除了此类问题之外)、但我们的 ARM 编译器仅内联其估计的调用将具有最大的好处。 如果我们将 C2000编译器更改为使用该方案、则确保所需行为的唯一方法是始终内联 pragma。