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、
我对 CLA 与 CPU 计算时间有一个(理解)问题。
我们使用 TMS320F28069。 为了进行测试和调试、我将绝对(!) 相同的代码。 第一个在主 CPU 中、第二个在 CLA 任务中。 我希望计算时间相同。
但我的测量显示 CLA 的计算时间要快得多。
差异是3µs μ A (CLA)与24µs μ A (CPU)!
来测量我切换 GPIO 的时间。
CLA 任务也由一个 GPIO 测量。 由 Sotwaretrigger (IACK)启动、由 CLA1_INT2_ISR 例程停止。 下面的代码全极。
所有需要的变量都位于 CLA1DataRam 区域中。 计算正确且有效(在 CLA 和 CPU 中)。
void main( void ){ … 初始化等 … EALLOW; GpioDataRegs.GPASET.bit.GPIO13 = 1;//开始测量时间 EDIS; _asm (" IACK #0x0002");//start CLA-Task2 } // INT11.2 __interrupt void CLA1_INT2_ISR (void)// CLA { EALLOW; GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;//停止测量时间 EDIS; PieCtrlRegs.PIEACX.ALL = PIEACK_group11; }
此代码需要计算的主要时间。 有一些分部。 但为什么 CLA 中的这种速度要快得多?
Δ_Z_o =((Ch)*(P_Z_o -(Δ_Z_o_n1 / RJC)* deltat)+Δ_Z_o_n1;
Δ_Z_o_n1=Δ_ZK_o;
此公式被调用6次(也与其他变量一同调用)。
编译器优化不会影响速度。
您是否对如何实现这一目标有一些想法?
谢谢你。
此致
Markus
其他要检查的内容:
是为 C28x 启用的浮点的编译器选项。 --float_support = fpu32
使用 C2000Ware 中的 FAST RTS 库。 (C:\ti\c2000\C2000Ware \libraries\math\FPUfastRTS)。 您可以检查生成的.map 文件以查看 C28x 除法是否来自此库。
您好、Lori、
这都是在一个任务中完成的。
类似:
my_calc_task { delta_Z_o =(Ch)*(P_Z_o -(delta_o_n1 / RJC)* deltat)+ deltat Z_o_n1; delta_Z_o_n1= delta_Z_o1 ;delta_z_o1 =(Ch)*(P_Z_o_n1);delta_1_del_z_delta_n1;delta_n1=delta_n1=delta_11_delta_dar_z_z_z_zh_delta_n1=(*) Δ_Z_o2 =((Ch)*(P_Z_o2 -(Δ_Z_o_n12 / Rjc2)*Δ tat)+Δ_Z_o_n12; Δ_Z_o_n12 =Δ_Z_o2; Δ_Z_o3 =(Ch)*(P_Z_o_n13)+Δ_Z_n3 Δ_Z_o_n13 =Δ_Z_o3; Δ_Z_o4 =(Ch)*(P_Z_o4 -(Δ_Z_o_n14 / Rjc4)*Δ tat)+Δ_Z_o_n14; Δ_Z_o_n14 =Δ_Z_o4; Δ_Z_o5 =((Ch)*(P_Z_o5 -(Δ_Z_o_N15 / Rjc5)* deltat)+Δ_Z_o_N15; Δ_Z_o_N15 =Δ_Z_o5; }
Markus
您好、Lori、
是的、分部正在使用 RTS-Lib。 来自:
C:/ti/ccsv8/tools/compiler/ti-cgt-c2000_18.1.4.LTS/lib/rts2800_fpu32.lib
但我对处理器的理解是对的吗?
CLA 中的(相同)代码必须与 CPU 中的代码一样快、对吧?
谢谢。
Markus
您好!
让我失望地看了一下。
CPU 1090delta_Z_o =(Ch)*(P_Z_o -(delta_o_n1 / RJC)* deltat)+ delta_Z_o_n1; 3dd465:761F0231 MOVW DP、#0x231 3dd467:FF69 SPM 0 3dd468:E2AF0004 MOV32 R0H、@0x4、UNCHF 3dd46a:761F0232 MOVW DP、#0x232 3dd46c:E2AF0116 MOV32 R1H、@0x16、UNCHF 3dd46e:767E0EB9 LCR FS$DIV 3dd470:761F0231 MOVW DP、#0x231 3dd472:E2A0100 MOV32 R1H、@0x0、UNCH 3dd474:761F0232 MOVW DP、#0x232 3dd476:E3204814 SUBF32 R1H、R1H、R0H || MOV32 R0H、@0x14 3dd478:761F0231 MOVW DP、#0x231 3dd47a:E3004116 MPYF32 R0H、R1H、R0H || MOV32 R1H、@0x16 3dd47c:761F0231 MOVW DP、#0x231 3dd47e:E7000008 MPYF32 R0H、R1H、R0H 3dd480:E2AF0104 MOV32 R1H、@0x4、UNCHF 3dd482:E7100040 ADDF32 R0H、R0H、R1H 3dd484:761F0231 MOVW DP、#0x231 3dd486:E2030006 MOV32 @0x6、R0H 1091Δ_Z_o_n1=Δ_Z_o; 3dd488:0606 MOVL ACC、@0x6 3dd489:761F0231 MOVW DP、#0x231 3dd48b:1E04 MOVL @0x4、符合
CLA 1187.Δ_Z_o =((Ch)*(P_Z_o -(Δ_Z_o_n1 / RJC)* deltat)+Δ_Z_o_n1; 00009cf0:73C08C96 MMOV32 MR0、@ @0x8c96、UNCF 00009cf2:7F000003 MEINVF32 MR3、MR0 00009cf4:7C000032 MMPYF32 MR2、MR0、MR3 00009fr:780A4000 MSUBF32 MR2、#0x4000 MR2 00009cf8:7C32 MMPYR2、MR3 M300M000R2:0xM32 MQM000R2 M000M000R2 MQM000R2 M000M32 MQM000R3:0xM000R2 M000M000M000R2 M000M000M000R2 M000M000M000R2 M000M000M000R2 M000M000M000R3 M000M000M000M000M000R2 M32 M000R2 M000M000M000R3 M000M000M000M000R2:0xM 07808C40 MMPYF32 MR2、MR3、MR1 || MMOV32 MR0、@0x8c40 00009d02:28408C94 MSUBF32 MR1、MR0、MR2 || MMOV32 MR0、@ @ @0x8c94 00009d04:01108C56 MMPYF32 | MMR032 MMR0| MMR032 MMR0 | MMR064 MMR0D32 MMR0 | MMR0M0M0M0M0M0M0M0M32 MMR0 MMR0M0M0M0M0M0M0M0M0M0M32 M0M0M0M0M0M0M0M0M0M0M0M0M32 M0M0M0M0M0M0M0M0M32 M0M0M0MMR0 @0x8c46、MR0 1188Δ_Z_o_n1=Δ_Z_o; 00009d0c:74C08C44 MMOV32 @0x8c44、MR0
CLA 中的代码效率更高。 但为什么呢?
希望这对您有所帮助。
谢谢 Markus
CPU 调用除法例程、该例程非常慢:
LCR F$$DIV
也许您没有将 C2000编译器->优化->浮点模式(--fp_mode)设置为宽松。 "严格"设置 会导致 FS$$DIV 调用。
Edward
尊敬的 Edward:
谢谢。 你是对的。 我更改为放松。 但 LCR F$$DIV 的调用已经存在。 请参阅下面的分解。
优化设置:
拆卸:
1090 delta_Z_o =((Ch)*(P_Z_o -(delta_o_n1 / RJC)* deltat)+ delta_Z_o_n1; 3dcd66:8B16 MOVL XAR1、@0x16 3dcd67:FF69 SPM 0 3dcd68:8214 MOVL XAR3、@0x14 3dcd69:761F0231 MOVW DP、#0x231 3dcd6b:BDA10F16 MOV32 R1H、@XAR1 3dcd6d:E2A000C MOV32 R0H、@0xc、UNCF 3dcd6f:767E136A LCR FS$$DIV 3dcd71:BDA30F16 MOV32 R1H、@XAR3 3dcd73:7700 NOP 3dcd74:7700 NOP 3dcd75:E7200038 SUBF32 R0H、R7H、R0H 3dcd77:761F0231 MOVW DP、#0x231 3dcd79:E7000009 MPYF32 R1H、R1H、R0H 3dcd7b:E2A004A MOV32 R0H、*- SP[10]、UNCF 3dcd7d:E7000040 MPYF32 R0H、R0H、R1H 3dcd7f:E2A010C MOV32 R1H、@0xc、UNCHF 3dcd81:E7100040 ADDF32 R0H、R0H、R1H 3dcd83:7700 NOP 3dcd84:7700 NOP 3dcd85:7700 NOP 3dcd86:BFA20F12 MOV32 @XAR2、R0H 3dcd88:761F0231 MOVW DP、#0x231
但它对速度没有影响。
有什么想法吗?
谢谢。
Markus
抱歉、我与 EINVF32指令不直接调用(例如 TMU 存在时的 DIVF32)、但仍调用 FS$$DIV、后者应使用 EINVF32进行快速分频操作。 我猜严格/宽松模式 与您无关、并且缺少 TMU 单元。
Guru 询问您是否正在使用 *fast RTS library*。 rts2800_fpu32.lib 速度不快。 您当然需要快速补充库 来进行快速除法。 添加后、请确保其优先级最高、为此、请尝试使用向上/向下箭头将其移至 C2000链接器->文件搜索路径->包含库文件...中的顶部。 列表框。
要确保 FAST 库正常工作、请尝试在调试器中单步进入 FS$DIV 例程、您应该会看到使用的 EINVF32指令。
Edward
一般而言、这取决于代码。 对于纯32位浮点数学运算、我希望它们是相似的。
例如、如果代码具有定点运算、许多分支、C28x 利用了一个重复块、那么 CLA 将不会像 C28x 那样发挥作用。 这是因为指令集、CLA 可用的寻址模式。
因为在您的案例中、C28x 花费的时间要长得多、似乎有些东西不适合苹果。
关于 C28x 代码的另一个问题是、它是从闪存还是 RAM 运行?
此外、若要检查代码是否正在拉入 FAST RTS 库、请查看生成的.map 文件并查看正在使用哪些对象库。
此致
Lori
尊敬的 Edward:
您好、Lori、
使用 rts2800_fpu32_fast_补 遗.lib 会产生最大的影响。
在使用 rts2800_fpu32.lib 之前
还有一个很好的建议:从闪存与 RAM 运行。
6,2µs μ A (RAM)至8,4µs μ A (闪存)
将6,7µs (不 9,2µs 编译器优化;RAM)更改为(不含编译器优化;闪存)
注意:之前过帐中的所有旧 CPU 测量将由从闪存运行来完成(CLA 程序始终从 RAM 运行)
出于完整性考虑:从闪存中反汇编,不使用 CompilerOptimization 1084Delta_Z_o =(Ch)*(P_Z_o -(delta_o_n1 / RJC)* deltat)+ delta_o_n1; 3dd46a:761F0231 MOVW DP、#0x231 3dd46c:E2AF0004 MOV32 R0H、@0x4、UNCHF 3dd46e:761F0232 MOVW DP、#0x232 3dd470:E2AF0116 MOV32 R1H、@0x16、UNCF 3dd472:767E137D LCR $C:/ti/controlSUITE/libs/math/FPUfastRTS/V100/source/div_f32.asm:52:71$ 3dd474:761F0231 MOVW DP、#0x231 3dd476:E2AF0100 MOV32 R1H、@0x0、UNCH 3dd478:761F0232 MOVW DP、#0x232 3dd47a:E3204814 SUBF32 R1H、R1H、R0H || MOV32 R0H、@0x14 3dd47c:761F0231 MOVW DP、#0x231 3dd47e:E3004116 MPYF32 R0H、R1H、R0H || MOV32 R1H、@0x16 3dd480:761F0231 MOVW DP、#0x231 3dd482:E7000008 MPYF32 R0H、R1H、R0H 3dd484:E2AF0104 MOV32 R1H、@0x4、UNCHF 3dd486:E7100040 ADDF32 R0H、R0H、R1H 3dd488:761F0231 MOVW DP、#0x231 3dd48a:E2030006 MOV32 @0x6、R0H 1085Δ_Z_o_n1=Δ_Z_o; 3dd48c:0606 MOVL ACC、@0x6 3dd48d:761F0231 MOVW DP、#0x231 3dd48f:1E04 MOVL @0x4、符合
我认为问题已经解决。
谢谢。
Markus