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.

[参考译文] TMS320F28386S:链接器不执行函数内联

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1448286/tms320f28386s-linker-does-not-perform-function-inlining

器件型号:TMS320F28386S

工具与软件:

大家好!

问题说明:

我目前正在开发一个具有以下代码结构等特性的应用程序:

// File interface.h
#pragma FUNC_ALWAYS_INLINE(some_function)
void some_function(uint16_t some_argument);

//File interface_implementation.c
#include "interface.h"

void some_function(uint16_t some_argument)
{
    // Some code that interacts with HW registers via pointers to volatiles
    // have also tried with code that does not access HW registers at all and also does not work
}

// File user_file.c
#include "interface.h"

#pragma INTERRUPT(user_isr)
static void user_isr(void)
{
    uint16_t argument = 10U;
    some_function(argument);
    
    // ISR flag handling etc..
}

我的目标是在 user_isr 中断中内联 some_function 调用,而不必对 some_function 使用 static inline。 这样就不需要公开 some_function 实现的所有内部信息。 鉴于 user_file.c 文件只能看到 some_function 的声明、而不能看到其实现、我依赖链接器内联 some_function 调用。 根据文档 SPRU514Z 第2.11章、链接器应该能够内联函数。 如果我在这方面有误、请更正我、还有其他方法可以解决此问题。

通过查看分解的输出 文件、可以看到 LCR 指令用于调用 Soome_function、从而确认它没有被内联。

测试过的内容(但未能解决问题):

我已经查看了 SPRU514Z 文档以了解如何做到这一点、并提出了以下尝试(在我的情况下无法正常工作):

  • CGT 版本:TI-CGT-C2000_20.2.1.LTS
  •  #pragma FUNC_ALWAYS_INLINE (some_function)恰好在函数声明之前。
  • 编译器标志: -opt_level=4 --opt_for_speed=5
  • 链接器标志: -opt_level=4 --opt_for_speed=5  (尽管我认为它不适用于链接器)

此外、我已经看到、 SPRU514Z 的第2.11.2节中 提到、在编译器"难以"执行内联的情况下、不会进行内联。 如果我没有错过任何东西,我不做任何这些。 "未声明内联项目符号..."让我感到怀疑,尽管我尝试明确使用内联键盘,但它没有帮助。

我肯定丢失了一些东西、但我不明白它是什么。 您能帮助我解决这个问题吗? 如果您 需要更多信息、我很乐意为您提供。

提前非常感谢您的帮助、

此致、

Francesc.

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

    您好!

    我已将该线程提请编译器专家的注意、他们可以提供更好的帮助。

    谢谢

    Ki

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

    你好--你能提供你正在使用 teh 工具建立的完整命令行吗?  此外、如果您可以使用预处理文件提供可重现的测试用例(这对我们很有帮助)、请按照 如何提交编译器测试用例一文中的说明进行操作

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

    Alan、您好!

    在这里您可以找到我用于编译和链接的标志:

    • 编译器: -v28 -ml -mt $\
      --float_support=fpu64 --idiv_support=idiv0 --tmu_support=tmu0 --fp_mode=relaxed $\
      --opt_level=4 --opt_for_speed=5 --printf_support=nofloat $\
      --symdebug:dwarf --symdebug:dwarf_version=4 $\
      --abi=eabi --gen_func_subsections=on $\
      --cla_support=cla2 --cla_signed_compare_workaround=on $\
      --advices:performance=all --relaxed_ansi $\
      --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number $\
      --check_misra="required"--misra_advisation=remark --misra_required=warning
    • 链接器: --opt_level=4 --opt_for_speed=5 $\
      --diag_suppress=10063 --diag_warning=225 --diag_wrap=off --display_error_number $\
      --run_linker --warn_sections --heap_size=0 --stack_size=0x7F6 --entry_point=code_start --rom_model --zero_init=on

    很遗憾、我不能分享我正在使用的完全预处理的文件、但我 将尝试在接下来的几天内创建一个可重现的测试用例、然后返回给您。

    非常感谢您的帮助、

    此致

    Francesc.

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

    Alan、您好!

    在尝试重新创建可重现的测试用例后、我找到了导致函数不内联的原因。

    第一篇文章中所述的初始代码结构在此处进行了扩展、提供了更多详细信息。 interface_implementation.c 文件(实现要内联的函数)还具有一些使用 ___ asm 语句的非静态函数。 尽管这些函数未在任何位置调用、但在编译和链接整个项目时、所需函数未内联。 从未使用的函数中删除_asm 语句会导致"somore_function"根据需要内联。

    //File interface_implementation.c
    #include "interface.h"
    
    void not_used_anywhere(void)
    {
        __asm(" EALLOW");
        
        // other things done with HW but no __asm statements
    }
    
    void some_function(uint16_t some_argument)
    {
        // Some code that interacts with HW registers via pointers to volatiles
        // have also tried with code that does not access HW registers at all and also does not work
    }

    在非静态函数中具有_asm 语句的 C 文件是否会导致该文件中的所有函数不再被链接器内联?

    根据 SPRU514Z 第2.11.2章、如果函数包含_asm 语句、则函数不会被内联、但我认为这与此行为无关。

    在我这边可以随时关闭这个帖子、我的问题现在已经解决了。

    非常感谢您的帮助、

    此致、
    Francesc.

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

    在我关闭该主题之前、我想添加一些注释、这些注释可能对稍后遇到该主题的其他人有所帮助。

    若要编译器内联函数、 函数的调用点和完整代码必须同时可见。  本文介绍了一种实现此目的的好方法 (不是来自 TI)。  请注意、它需要您使用这些选项针对 EABI 和 C99进行构建 -- abi=eabi. 第99章 .  但无论如何、几乎总是如此。

    谢谢。此致、

    -George.