工具/软件:TI C/C++编译器
你(们)好
我们有一个时间紧迫的交换电源应用程序,通过将变量(b)与0.01 相乘,可以发现该应用程序会导致某种"CPU-问题"(嗯,ISR每10秒运行一次,有时会由于中断延迟而失败-我猜是这样)。 C编译器如何处理此0.01 乘法运算? 它是否与a=b/100相同(我认为这是一个较慢的实施/执行)?
此致
Terje Bøhler ć(我目前实际上没有访问源代码的权限...)
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.
工具/软件: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
非常感谢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评论"...怀疑某些硬件配置错误..."时,您有什么建议吗?[/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提供服务。