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个字节 不知道哪个是对的?
谢谢!
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.
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个字节 不知道哪个是对的?
谢谢!
这个运算为几个指令周期?
取决于自己,工程师编写了一个该代码的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 周期。 由于其他系统影响 (如缓存或内存等待状态) 而发生的周期将被忽略。)