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.

[参考译文] 有关 TMS320C28x C/C++编译器表达式简化的问题

Guru**** 2586535 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1077860/questions-about-expression-simplification-in-tms320c28x-c-c-compiler

“线程:测试”中讨论的其它部件

尝试从编译器手册中了解有关表达式简化的一些详细信息,我有一些问题需要澄清:

  • 从手册中不确定哪一级的优化包括表达式简化? 或者,即使优化已关闭,也会发生这种情况吗?
  • 表达式简化是否会在包含特写时发生? 例如,如果我在下面的示例中使用宏 SENSOR_LSB,它会在运行时执行除法运算,还是编译器会意识到它在任何地方都是恒定值?

#define SENSOR_MAX_COUNTS 1000U
#define SENSOR_RANGE      5.0
#define SENSOR_LSB        (SENSOR_RANGE/(float)SENSOR_MAX_COUNTS)

谢谢!

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

    表达式简化是一个宽泛的术语。  它有许多形式。  其中一些比较简单,而另一些比较复杂。

    [引用 userid="423429" url="~/support/tools/code-composer-studio -group/CCCS /f/code-composer-studio -forume/1077860/ questions-about-expression-simility-in-TMS320C28x-c-c-compiler"]即使优化已关闭,也会发生吗?[/quot]

    更简单的形式,是的。

    [引用 userid="423429" url="~/support/tools/code-composer-studio -group/CCCS /f/code-composer-studio -forume/1077860/ questions-about-expression-simple-in-in-TMS320C28x-c-c-c-compiler"]如果我在下面的示例中使用恒定的 sensor _LSB,宏是否会在任何地方运行?]

    编译器知道它在任何地方都是一个常量值。

    谢谢,此致,

    乔治

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

    谢谢! 这可能是进入杂草的过程,但我试图让自己成为一个测试用例,并在做原始帖子之前查看生成的装配体。 我使用的相关代码位是:

        int16_t ii;
        volatile uint32_t testCnts;
        volatile float testFloat;
    
        for(ii = 0; ii < 5; ii++)
        {
            testCnts = ii*10;
            testFloat = testCnts * SENSOR_LSB; //(this is line 100)
        }

    生成以下装配体代码的...:

            UI32TOF64 R0,*-SP[2]            ; [CPU_FPU] |100| 
            NOP       ; [CPU_ALU] 
            MPYF64    R0,R0,#16048          ; [CPU_FPU] |100| 
            NOP       ; [CPU_ALU] 
            NOP       ; [CPU_ALU] 
            F64TOF32  R0H,R0                ; [CPU_FPU] |100| 
            NOP       ; [CPU_ALU] 
            MOV32     *-SP[4],R0H           ; [CPU_FPU] |100| 

    (笑声) 我对装配体还不是很好,但我认为 UI32TOF64指令是我的#define sensor_LSB 的特别指令。 如果是这样,我想要么我需要打开优化,让它在没有任何附加指令的情况下向 testFloat 变量写入常量值,要么我对表达式简化(特别是编译器指南第3.16.5节中描述的表达式简化的形式)的工作方式有误... 或者我想,我只是对 UI32TOF64为什么会存在这一问题感到错误?

    再次感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="423429" url="~/support/tools/code-composer-studio -group/CCCS /f/code-composer-studio -forume/1077860/关于表达式简化的问题 TMS320C28x-c-c-c-compiler/3989525#3989525"]或者我认为,我的 U3264为什么会出现错误[

     SENSOR_RANGE 的定义是:

    #define SENSOR_RANGE      5.0

    其中,未足量的浮点字5.0隐式键入 double,导致编译器将计算提升为 double 精度。

    通过在表达式的简化程度中添加后缀 f,尝试更改以使用单精度浮点型文字:

    #define SENSOR_RANGE      5.0f

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

    好的,我尝试了,它确实将它缩短为5个指令,而不是8个指令,但似乎仍然是特写:

            UI32TOF32 R0H,*-SP[2]           ; [CPU_FPU] |100| 
            NOP       ; [CPU_ALU] 
            MPYF32    R0H,R0H,#13984        ; [CPU_FPU] |100| 
            NOP       ; [CPU_ALU] 
            MOV32     *-SP[4],R0H           ; [CPU_FPU] |100| 

    尽管将优化设置为两个或更高,但在对一段时间进行修修补后,UI32TOF32指令似乎会消失, 但是,由于我没有做好在项目中启用优化的准备,但这一切都只是学术方面的事情...现在,针对这种特殊情况的一些额外说明对于轻松交换传感器配置来说是一个合理的交易。  

    无论如何,再次感谢您的帮助!