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.

[参考译文] F29H859TU-Q1:TI F29 / C29 clang 编译器:如何在代码中创建屏障

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1650697/f29h859tu-q1-ti-f29-c29-clang-compiler-how-to-create-a-barrier-in-the-code

器件型号: F29H859TU-Q1

您好:

我正在使用 C29 Clang 编译器、我正在寻找在代码中创建屏障的理想方法、指令编译器不要将屏障前面的代码与屏障后面的代码混合。

此功能非常有用、例如、能够测量某些代码的持续时间(以保证我们正在测量所需的内容)。

我听说过不同的解决方案、但我不确定它们的稳健性:

  • __ builtin_instrumentation_label()
  • ASM Volatile (““)
  • asm volatile(““:::“memory“)

因此、请提供我们所使用的解决方案、并希望此解决方案在当前版本的编译器 (2.2.0 LTS) 上的限制、但将来可能会有哪些限制(从全球范围来看,保证内容及不保证内容)。

谢谢你

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

    您好:

    我已将此线程提请编译器专家注意以进行进一步分析。  

    谢谢

    Ki

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

    我们确实使用 asm volatile 和__ builtin_instrumentation 标签进行了保证。 任何易失性或存储器操作都不会围绕给定语句移动。

    但是、非存储器操作、例如通用算术、比较、按位运算等 优化开启时、信号仍可能移动。

    通过将要配置的代码放入标有__attribute__((noinline)) 的函数中、然后从标有__attribute__((optnone)) 的函数调用此函数、可以实现最一致的数字。 对分析代码的调用应被所选计时函数和指令标签包围。 性能分析函数上的“optnone“属性可确保在优化级别(-on 选项)发生变化时、由于性能分析函数本身的变化、数字不会发生变化。

    __attribute__((noinline)) void profiled_code(int *out, int *in) {
        /* Profiled code goes here */
    }
    
    extern unsigned int read_timer();
    extern unsigned int calc_time(unsigned int start, unsigned int stop);
    __attribute((optnone)) void do_profile() {
        int *in_array; /*= ...*/;
        int *out_array; /* = ...*/;
        unsigned int start = 0, stop = 0;
    
    
        start = read_timer();
        __builtin_instrumentation_label("profile_start");
        profiled_code(out_array, in_array);
        __builtin_instrumentation_label("profile_stop");
        stop = read_timer();
    
        unsigned int total_time = calc_time(start, stop);
        /* Do something with total_time */
    }

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

    您好、James、

    感谢您的答复。

    在 __ builtin_instrumentation_label()、 asm volatile (““)和 asm volatile(“““::::“memory“)之间、什么是最好的候选项? 或者它们的行为都是一样的吗?

     如果 asm volatile (““)具有相同的行为、为什么要创建__builtin_instrumentation_label()? 或者 ,__ builtin_instrumentation_label() 有附加功能吗?

    谢谢你

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

    对于所有意图和目的、__builtin_instrumentation_label(“name“)等效于 asm volatile(“name:\n“)。

    但是、编译器会处理 asm volatile(“...“) 因为除了成为障碍外、还可能具有任何不可追溯(也称为非寄存器)效果。 据知、仪器标签只是其类似于屏障的行为之外的标签、因此它不会影响大小、流水线行为等

    对于我们的 ARM 客户、如果是编写可移植代码、我建议使用 ASM Volatile、否则使用仪器标签。 对于 C29、我会使用该标签、除非您在汇编中需要放置标签以外的其他东西。

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

    感谢您的支持