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:运行指令周期问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1105648/tms320f28027-operation-instruction-cycle-issue

器件型号:TMS320F28027

大家好、

以下是客户提出的问题、可能需要您的帮助:

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

1)  c=a*b;

这需要多少个指令周期?

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

在这种情况下、需要多少个指令周期?

3) d = a*b;

这个?

您能帮您检查这些问题吗? 谢谢。

此致、

樱桃

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

    最好的方法是向您展示如何确定...

    [引用 userid="496057" URL"~μ C/support/microriors/c2000-microset-group/C2000/f/c2000-microset-forum/1105648/tms320f28027-operational-instruction-cycle-issue"]这需要多少个指令周期?

    自己。

    编写一个小测试用例、其中包含您感兴趣的代码。  例如...

    /* 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| 
    

    忽略包含.dwo程 的行。  这些是 CCS 中的调试器使用的汇编指令。  其余的行是 CPU 指令。  您可以在 《TMS320C28x DSP CPU 和指令集参考指南》中找到它们。  这一行...

        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 函数不是很长、所以对其中的周期进行计数并不是很困难。  但是、某些功能会更长。  在某些时候、以这种方式运行代码和对周期进行计数更容易。 有关更多详细信息、请参阅文章 对周期进行计数

    请注意、在这个帖子中、只考虑 CPU 周期。  由于高速缓存或内存等待状态等其他系统影响而发生的周期将被忽略。   

    谢谢、此致、

    乔治