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.

[参考译文] 编译器/TMS320F2.8069万:a=b* 0.01 的C执行速度(除以100)

Guru**** 2540720 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/576707/compiler-tms320f28069-c-execution-speed-for-a-b-0-01-divide-by-100

部件号:TMS320F2.8069万

工具/软件:TI C/C++编译器

你(们)好

我们有一个时间紧迫的交换电源应用程序,通过将变量(b)与0.01 相乘,可以发现该应用程序会导致某种"CPU-问题"(嗯,ISR每10秒运行一次,有时会由于中断延迟而失败-我猜是这样)。 C编译器如何处理此0.01 乘法运算? 它是否与a=b/100相同(我认为这是一个较慢的实施/执行)?

此致

Terje Bøhler ć(我目前实际上没有访问源代码的权限...)

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

    我假定您使用编译器开关 --float_support=fpu32进行构建。  在这种情况下,乘以0.01 比除以100快得多。  

    如果使用 --float_support=fpu32进行构建,我怀疑某些硬件配置错误会导致您的问题。  要实现这一点,您需要 C2000论坛专家的帮助。  你可以在那里开始新的主题,或者我可以将这个主题移到那个论坛。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果变量a和b是整数,则可能不是通过引入浮点表达式来满足自己的需要。 a和b有哪些类型?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢Georg (顺便说一句,我对C2000没有太多的经验)

    我们使用TMS 320F2.8069万,下面是 一些使用的编译器选项:

    处理器选项:

    配置:调试[活动]

    摘要标志集:

    -v28 -ml -mt --cla_support=cla0 --float_support=fpu32 --vcu_support=vcu0 --

    。 。 。

    include_path="C:/SW_PS/SW_C68/DcDcCtrl1/DcDcCtrl/F2806x_BSP/IQmatx/include"--

    include_path="C:/SW_PS/SW_C68/DcDcCtrl1/DcDcCtrl/F2806x_BSP/PowerLib/ASM"-g --define="_debug"--define="__target_ccs"--define="flash"--define="lag_model"--diag_warning=225

    优化:

    优化级别:关闭

    速度与大小的权衡:2.

    Allow reassozation of FP arithm: On (允许FP算术重新分析:开)

    浮点模式(--fp_mode):严格

    我觉得很奇怪的是,像上面这样的简单计算(A = 0.01 * A,其中A是 UINT16)有时可能会产生这样的破坏性影响(由 ISR的进入时间延迟, 每 5 us输入一个(不是前面提到的10 us)?)。

    Q-1:简单乘法"A=A*ISR"如何影响(“背景0.1 ”)延迟? (ISR每5us执行一次,而不是10us执行一次)

    Q-2:在“A=A*ISR”语句中是否执行了任何“中断禁用”,从而导致0.1 延迟?

    Q-3:在执行“0.1 ”时,是否可能存在其他类型的“等待或延迟”?
     例如  "原子DSP/BIOS操作"在等待计算的浮点/定点乘法结果时阻止中断?

    问题4:您说:"那么我怀疑某些硬件配置错误会导致您的问题"。 这可能是什么? 是否可能"硬件配置错误"?

    Q-5: 对于这样的“A=A*DPS 0.1 ” 操作(TCY为60MHz),DPS的消耗/执行时间通常是多少?

    我非常感谢对这种(对我来说)非常奇怪的行为的进一步评论。

    此致

    Terje Bøhler ć

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

    [QUETE USER="Terje Bohler1"]Q-2:是否在“A=A*ISR”语句中执行了任何“中断禁用”,从而导致0.1 延迟?

    Q-3:在执行“0.1 ”时,是否可能存在其他类型的“等待或延迟”?
     例如  "原子DSP/BIOS操作"在等待计算的浮点/定点乘法结果时阻止中断?

    问题4:您说:"那么我怀疑某些硬件配置错误会导致您的问题"。 这可能是什么? 是否可能"硬件配置错误"?

    Q-5: 对于这样的“A=A*CCS” 操作(0.1 为60MHz),DPS的消耗/执行时间通常是多少?[/QUOT]您应该能够查看生成汇编程序并使用配置文件时钟来回答这些问题。

    例如,我为TMS320F2.8069万创建了一个测试项目,使用以下选项进行编译:

    "C:/ti_ccs7_0/ccsv7/tools/compiler/ti-CGT-C2000_S2000_slts/bin/cl2000"<xmt-block0>2000 16.92000 16.9 -v28 -ml -mt --cla_support=cla0 --float_support=fpu32 --vcu_support=vcu0 --include_path="C:/ti_ccsdiag_support=clus-cru_-fu_-fu_32 -cru_gu_gu_-d=-cru_gu_re_d=7-16.9 

    一个函数使用浮点乘以除以100:

    uINT16_t double_scale (uint16_t A)
    {
    A = A * 0.01 ;
    
    返回A;
    } 

    具有以下说明:

    double_scale():
    0.8019万:FE02 ADDB SP,#200801
    a:9641 MOV *-SP[1],AL
    17 A = A * 0.01 ;
    0.0801万b:E801E118 MOVIZ R0,#0x3c2300801
    d:E2C4.0141万 UI16TOF32 R1H,*-SP[1]
    0.0801万f:E80EB850 MOVXI R0H,#0xd70a
    0.8021万:E700.004万 MPYF32 R0H,R0H,R1H
    0.8023万:7700 无操作
    0.8024万:E68E0000 F32TOUI16 R0H,R0H
    0.8026万:7700 无操作
    0.8027万:7700 无操作
    0.8028万:BFA90F12 MOV32 @ACC,R0H
    0.0802万a:9641 MOV *-SP[1],AL
    20 }
    0.0802万b:FE82 副B SP,#200802
    c:0006 LRETR 

    另一个函数执行整数除以100:

    uINT16_t uint_scale (uint16_t A)
    {
    A = A/100;
    
    返回A;
    }
    

    具有以下说明:

    UINT_scale():
    0.8041万:FE02 ADDB SP,200.8042万
    :9641 MOV *-SP[1],AL
    31 A = A / 100;
    0.8043万:BE64 MOVB XAR6,#0x6400.8044万
    :0E41 MOVU ACC,*-SP[1]
    0.8045万:F60F 报告 #1500.8046万
    :1FA6 |||SUBCU @,v í AR600.8047万
    :9641 MOV *-SP[1],AL
    34 }
    0.8048万:FE82 副B SP,200.8049万
    :0006 LRETR 

    我看不到任何禁用中断的指令。

    为了测量这两个函数的相对性能,使用CCS中的配置文件时钟为调用每个函数的循环次数计时100次。

    double_scale()函数执行固定到浮点的浮点乘法,然后浮点到固定的转换,平均花费41个周期。

     执行整数除法的uint_scale()函数平均花费51个周期。

    这表明浮点乘法比整数除法的速度更快。 您可以根据时钟频率将周期数转换为时间,以获得执行时间的估计值。

    我说估计是因为:

    a)我测量的时钟周期数包括函数调用和回路的开销。

    b)在 double_scale()函数中,该函数只执行 a = a * 0.01 ,编译器插入了三个NOP,大概是为了支持处理器流水线。 如果在另一个函数内执行计算,编译器可能能够通过管道传递其他指令,而不是NOP。

    C)我没有为您的TCY配置60 MHz所需的闪存等待状态数。 从SRAM而不是闪存执行代码可能会更快。

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

    谢谢切斯特。

    您是否有任何建议,请Georges评论"...怀疑某些硬件配置错误..."?

    是否有任何可能导致硬件配置错误的方法,从而导致我的症状?

    而且,对我来说,生成的代码似乎是“完全中断的”(由PWM或其他 中断源...)。

    此致  

    Terje Bøhler ć  

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

    Georges评论"...怀疑某些硬件配置错误..."时,您有什么建议吗?[/QUOT]我没有任何有关硬件配置错误的具体信息。

    您提到需要每5微秒处理一次中断,而CPU频率为60 MHz。 这意味着每300个时钟就有一个中断需要维修。 在添加有问题的“a=b*Interrupt 0.01 ”计算之前,您是否有中断服务需要多长时间的测量结果?

    可能由于添加了“a=b*ISR”,0.01 的服务会延迟到足以导致问题的程度。

    此外,ISR的服务方式。 例如,您是否在程序中使用SYS/BIOS?

     ti.platforms.ezdsp2.8335万有一些SYS/BIOS基准,它们将“Hwi调度程序提示”报告为 251时钟,将“Hwi调度程序提示”报告为 181时钟,这意味着SYS/BIOS HWI每300个时钟就无法为ISR提供服务。