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.

[参考译文] 编译器/TMS320F2.8377万S:pragma function_options不覆盖项目标志

Guru**** 2589300 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/617136/compiler-tms320f28377s-pragma-function_options-not-overriding-project-flags

部件号:TMS320F2.8377万S

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

您好,

我正在使用编译器TI v 15.12 .1.LTS来运行F2.8377万s和CCS 7.0 .x  我有一个包含循环的函数,我已经用NOP进行了手动优化,可以在250个时钟中执行。  因此,我希望能够修改项目的编译器优化,同时保持此函数不受优化,这样我的循环就保持不变。  但是,我是否将项目设置为-O0,将function_options pragma设置为

#pragma function_options (send_leed_data,"--opt_level=3")

或者反之,似乎仍在使用项目的-Ox标志编译函数send_led数据,并且忽略pragma。  也许我错过了其他一些设置来使function_options工作?

谢谢,Dave

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

    db_Woodall 说:
    似乎仍在使用项目的-Ox标志编译函数send_led数据,且pragma被忽略。  [/引述]

    您认为这是什么情况?  您是如何看待它的?

    请按照文章 How to Submit a Compiler Test Case (如何提交编译器测试用例)中的说明为包含函数send_led数据的源文件发送测试用例。

    谢谢,此致,

    -George

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

    您好,George,

    此程序可驱动WS2812 RGB LED的大型面板,因此,如果位感叹号回路不正确,LED会随机闪烁。  我还可以通过查看CpuTimer1Regs.TIM来判断,它以CPU的200MHz速率运行。

    测试: 在位感叹号循环中的第一个指令上设置断点,然后再次点击它并减去计时器值:

    1. 使用-Ooff编译对于项目,没有函数pragma,循环时间为250时钟(如预期)。
    2. 使用-O2进行编译对于项目,没有函数pragma,循环时间为27时钟。
    3. 使用-O2对项目进行编译并启用pragma“--opt_level=off”,我预期循环时间为250时钟,但它是194时钟。
    4. 使用-Ooff为项目编译并启用pragma“--opt_level=2”,循环时间为246。
    5. 使用-O2对项目进行编译并启用pragma“--opt_level=2”,循环时间为27。

    因此,它正在执行某些操作,但函数pragma不会生成与项目属性设置等效的代码。  如果我可以依靠它来使用相同的函数pragma生成相同的代码,而不管项目设置是什么,我可以重新调整-O2的循环并保留它。  我将查看发送代码的说明。

    谢谢,Dave

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

    附加是源。  如果您在第1.8457万行设置了断点,请按两次并比较CPU1定时器值,您可以很容易地看到循环时间。  这是使用-O2为项目和函数pragma构建的。 编译器工具版本为v.15.12 .1。

    谢谢!  戴夫

    e2e.ti.com/.../led_5F00_driver.pp.txt

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

    感谢您发送测试案例。  我无法运行代码。  所以我不知道我是否完全照搬了你所描述的内容。  但是,我确实看到编译器忽略了此指令...

    #pragma function_options (send_leed_data_13,"--opt_level=off") 

    这不好。  因此我在 SDOWP系统中提交了CodeGen-3614以调查此案例。  欢迎您使用我签名中下面的SDOWP链接进行关注。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    functions_options pragma由优化器解释。 这意味着两件事:第一,您必须至少有-O0才能使pragma生效,第二,由于您已经在优化程序中,所以pragma中的--opt_level=off不起作用,并且始终会进行一些最小的处理。 换言之,您的案例3和4不能按您的预期行为。

    为什么pragma如此工作? 嗯,它是内部开发的,目的不相关,后来证明对内部项目有用,然后是客户问题的解决方案,因此我们将其公开。 该行为反映的是实现,而不是有意设计。

    我们可以增强编译器以修复这些皱纹,但不会很快。 实现目标的最佳方法是:(a)将经过精心定时的函数放在自己的文件中,并在项目的其他部分自行完成任务时,使用CCS文件特定的选项对其进行编译,或(b)在汇编中编写经过精心定时的函数, 这不仅能为您提供精确的计时,而且还能与任何其他编译器的阴道隔绝。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢George和pf,

    我当然可以用它自己的优化设置来编译文件。  如果pragma未更新,最好在编译器用户指南中记录该行为。

    谢谢,Dave