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.

TMS320F28027: 程序中不可避免使用到浮点数,下面的情况运行指令周期分别是多少?

Part Number: TMS320F28027


1.uint16_t a =60123;float b=0.001236;uint16_t c =0; float d=0;

第一种情况:

c=a*b;

这个运算为几个指令周期?

第二种情况:

c=a*5>>12;//(5=b*4096)

这种运算周期为多久?

第三种情况:

d=a*b;

这种运算周期为多久?

此外顺便提下,我以前提问IIC问题,有人回答是16字节FIFO 可我看了详细资料是4个字节 不知道哪个是对的?

谢谢!

  • 您好,

    此外顺便提下,我以前提问IIC问题,有人回答是16字节FIFO 可我看了详细资料是4个字节 不知道哪个是对的?

    麻烦po一下具体的问题。

  • 这个运算为几个指令周期?

    取决于自己,工程师编写了一个该代码的test case,如下:

    /* file.c */
    
    #include <stdint.h>
    
    uint16_t a =60123;
    float b=0.001236;
    uint16_t c =0;
    float d=0;
    
    void counting_cycles()
    {
        c=a*b;
    }

    编译它就像在应用程序中编译源文件一样(除了添加构建选项 -src_interlist)。 默认情况下,自动生成的汇编代码文件被删除。 而此选项会使其保持不变。 此外,还添加了注释,便于理解。 该文件与源文件具有相同的名称,只是扩展名更改为 .asm。 检查生成的汇编代码文件。 某些行可能看起来类似于以下:

    ;----------------------------------------------------------------------
    ;  12 | c=a*b;                                                                 
    ;----------------------------------------------------------------------
            MOVW      DP,#_a                ; [CPU_ARAU] 
            MOV       AL,@_a                ; [CPU_ALU] |12| 
    $C$DW$6	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$6, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$6, DW_AT_name("U$$TOFS")
    	.dwattr $C$DW$6, DW_AT_TI_call
    
            LCR       #U$$TOFS              ; [CPU_ALU] |12| 
            ; call occurs [#U$$TOFS] ; [] |12| 
            MOVW      DP,#_b                ; [CPU_ARAU] 
            MOVL      XAR6,@_b              ; [CPU_ALU] |12| 
            MOVL      *-SP[2],XAR6          ; [CPU_ALU] |12| 
    $C$DW$7	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$7, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$7, DW_AT_name("FS$$MPY")
    	.dwattr $C$DW$7, DW_AT_TI_call
    
            LCR       #FS$$MPY              ; [CPU_ALU] |12| 
            ; call occurs [#FS$$MPY] ; [] |12| 
    $C$DW$8	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$8, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$8, DW_AT_name("FS$$TOU")
    	.dwattr $C$DW$8, DW_AT_TI_call
    
            LCR       #FS$$TOU              ; [CPU_ALU] |12| 
            ; call occurs [#FS$$TOU] ; [] |12| 
            MOVW      DP,#_c                ; [CPU_ARAU] 
            MOV       @_c,AL                ; [CPU_ALU] |12| 

    忽略包含 .dwsomething 的行。 这些是调试器在 CCS 中使用的汇编指令。 其余的行是 CPU 指令。

    您可以在TMS320C28x DSP CPU and Instruction Set Reference Guide中查找。

    这一行是对函数的调用:

        LCR       #U$$TOFS

    不是用户函数,而是编译器 RTS 库中的函数。 此特定函数将无符号 16 位值转换为 32 位浮点值。 此函数的代码随编译器提供。 它位于一个位置类似于C:\ti\ccs1110\ccs\tools\compiler\ti-cgt-c2000_21.6.0.LTS\lib\src\u_tofs28.asm 的文件中。

    这个特定的 RTS 函数不是那么长,因此计算其中的周期并不是很困难。 不过某些函数更长。 在某种程度上,运行代码并以此方式对周期进行计数会更容易。 有关详细信息,请参阅Counting Cycles

    (请注意我们这里仅考虑 CPU 周期。 由于其他系统影响 (如缓存或内存等待状态) 而发生的周期将被忽略。)