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
Markus、
您提到计算完成了6次。 这是在一个任务期间完成的、还是需要触发6次任务?
-洛里
其他要检查的内容:
是为 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
您好!
重要的问题已经存在:
CLA 中的(相同)代码必须与 CPU 中的代码一样快、对吗?
谢谢你。
Markus
一般而言、这取决于代码。 对于纯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