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.

[参考译文] 计算编译时的常量,而不是运行时的常量

Guru**** 2524460 points
Other Parts Discussed in Thread: MSP430F2418

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1066465/calculating-constants-at-compile-time-not-run-time

《线程》中讨论的其他部件:MSP430F2418

使用 Code Composer Studio 进行 MSP430设计时 ,编译器向我发出警告,建议我不要使用浮点数学,因为浮点数学是处理器密集型的(或具有此种效果的东西)。 很抱歉-我没有确切的警告。

我很困惑,因为编译器似乎认为我想在运行期间使用浮点数学,我当然不想使用浮点数学。 但是,我确实有一些#defines 使用一些中间浮点值,这些值最终将被类型转换为整数值,以便在运行时使用,或者至少这是计划。 下面是定义。

#define XT_FREQ 10000000UL
#define core_reset_time (float)(0.000050)

#define MCLK_DIV 8UL
#define SMCLK_DIV 8UL
#define ACLK_DIV 256UL

#define MCLK_FREQ (间壁频率/ MCLK_DIV)
#define SMCLK_FREQ (间壁频率频率/ SMCLK_DIV)
#define ACLK_FREQ (间壁频率/ ACLK_DIV)

#define ACLK_period ((浮点) 1/(浮点) ACLK_FREQ)
#define SMCLK_Period ((浮点) 1/(浮点) SMCLK_FREQ)

#define TIMB1_core_reset_CCR0 (无符号短)(舍入(core_reset_time / SMCLK_period))

最终,我在运行时唯一感兴趣的值是 TIMB1_core_reset_CCR0。 这应计算出值63,以便在运行时使用。 浮点值在代码中的任何位置都不被引用。 如何强制编译器理解这不是使用浮点计算运行时间,而是一种用于计算整数常量以供运行时间使用的参数化方法?

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

    对于在检测到此诊断程序时正在编译的源文件...

    [引用 userid="155873" url="~/support/tools/code-composer-studio -group/CCCS /f/code-composer-studio -forume/1066465/ calculating -constantse-ate-ate-compile-time 不运行时"]编译器正在向我发出警告,建议我不要使用浮点数学[/quot]

    请 按照文章 “如何提交编译器测试用例”中的说明进行操作。

    谢谢,此致,

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="155873" url="~/support/tools/code-composer-studio 组/CCCS /f/code-composer-studio 论坛/1066465/计算常量-编译时-不运行时]#define TIMB1_core_reset_CCR0 (CLShort)(ROUND (core_reset[核心/时间])]

     引用 ROUND ()函数的函数。 我不确定编译器常量评估是否能够消除函数调用。

    如果您尝试:

    #define TIMB1_CORE_RESET_CCR0 (unsigned short)((CORE_RESET_TIME / SMCLK_PERIOD) + 0.5f)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    引用 ROUND 函数的[引用 userid="91588" url="~/support/tools/cod-composer-studio -group/CCCS /f/code-composer-studio -forum/1066465/ calculating -constantse-at-编译 时不运行时/3947025#3947025]'。 我不确定编译器常量评估是否能够消除函数调用。

    附件中有两个示例项目,它们都是使用 TI MSP430编译器 v21.6.0使用优化级别0 (寄存器优化)编译的。

    MSP430F2418_compiler_constants_Round 使用原始  TIMB1_core_reset_CCR0宏定义,该定义使用 ROUND 函数:

    #include <msp430.h> 
    #include <math.h>
    
    #define XTAL_FREQ 10000000UL
    #define CORE_RESET_TIME (float)(0.000050)
    
    #define MCLK_DIV 8UL
    #define SMCLK_DIV 8UL
    #define ACLK_DIV 256UL
    
    #define MCLK_FREQ (XTAL_FREQ / MCLK_DIV)
    #define SMCLK_FREQ (XTAL_FREQ / SMCLK_DIV)
    #define ACLK_FREQ (XTAL_FREQ / ACLK_DIV)
    
    #define ACLK_PERIOD ( (float)1/(float)ACLK_FREQ )
    #define SMCLK_PERIOD ( (float)1/(float)SMCLK_FREQ )
    
    #define TIMB1_CORE_RESET_CCR0 (unsigned short)(round(CORE_RESET_TIME / SMCLK_PERIOD))
    
    /**
     * main.c
     */
    int main(void)
    {
    	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    	
    	return TIMB1_CORE_RESET_CCR0;
    }
    

    编译上述内容时:

    A. 获取“备注#1531-D:(ULP 5.2)检测到浮点运算。 建议在运行期间或不使用时将它们移动到 RAM,因为这些是处理/功率密集型的”,报告了52次。

    B. 链接器映射文件显示正在从编译器运行时库链接浮点库函数,例如 ROUND, LARF, __mspabi_addd, __mspabi_fixdu

    C. 链接器映射显示的总大小为 32776 (代码), 64 (ro data), 80 (RW data)

    D. 汇编器列表显示 了返回 TIMB1_CORE _RESET_CCR0语句函数的名称:

    	.dwpsn	file "../main.c",line 27,column 2,is_stmt,isa 0
            MOV.W     #0,r12                ; [] |27| 
            MOV.W     #57344,r13            ; [] |27| 
            MOV.W     #16383,r14            ; [] |27| 
            MOV.W     #16463,r15            ; [] |27| 
    $C$DW$5	.dwtag  DW_TAG_TI_branch
    
            CALLA     #round                ; [] |27| 
                                              ; [] |27| 
    $C$DW$6	.dwtag  DW_TAG_TI_branch
    
            CALLA     #__mspabi_fixdu       ; [] |27| 
                                              ; [] |27| 
    	.dwpsn	file "../main.c",line 28,column 1,is_stmt,isa 0
    $C$DW$7	.dwtag  DW_TAG_TI_branch
    
            RETA      ; [] 
    

    MSP430F2418_compiler_constants_cast 使用  TIMB1_core_reset_CCR0宏定义中的类型:

    #include <msp430.h> 
    
    #define XTAL_FREQ 10000000UL
    #define CORE_RESET_TIME 0.000050
    
    #define MCLK_DIV 8UL
    #define SMCLK_DIV 8UL
    #define ACLK_DIV 256UL
    
    #define MCLK_FREQ (XTAL_FREQ / MCLK_DIV)
    #define SMCLK_FREQ (XTAL_FREQ / SMCLK_DIV)
    #define ACLK_FREQ (XTAL_FREQ / ACLK_DIV)
    
    #define ACLK_PERIOD ( (double)1/(double)ACLK_FREQ )
    #define SMCLK_PERIOD ( (double)1/(double)SMCLK_FREQ )
    
    #define TIMB1_CORE_RESET_CCR0 (unsigned short)((CORE_RESET_TIME / SMCLK_PERIOD) + 0.5)
    
    /**
     * main.c
     */
    int main(void)
    {
    	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    	
    	return TIMB1_CORE_RESET_CCR0;
    }
    

    编译上述内容时:

    A. 编译器不再报告“备注#1531-D:(ULP 5.2)检测到浮点运算。”

    B. 链接器映射不显示正在链接的浮点库函数。

    C. 链接器映射显示的总大小为50 (代码),64 (ro data),80 (RW data)。 即,由于不提取浮点库函数,因此大幅减小了大小。

    D.  汇编器列表显示 返回 TIMB1_core_reset_CCR0语句的汇编器使用在编译时计算的常量值63,并且不存在函数调用:

            MOV.W     #63,r12               ; [] |26| 
    	.dwpsn	file "../main.c",line 27,column 1,is_stmt,isa 0
    $C$DW$3	.dwtag  DW_TAG_TI_branch
    
            RETA      ; [] 
    

    请注意,由于 TIMB1_core_reset_CCR0的计算结果是将值62.5四舍五入到整数,因此我必须更改宏以使用所有双精度计算,以确保四舍五入的整数是63,而不是62。

    e2e.ti.com/.../MSP430F2418_5F00_compiler_5F00_constants_5F00_round.zip

    e2e.ti.com/.../MSP430F2418_5F00_compiler_5F00_constants_5F00_cast.zip