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.

[参考译文] TMS320F28069:计算时间 CPU 与 CLA

Guru**** 2020320 points
Other Parts Discussed in Thread: TMS320F28069, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/899644/tms320f28069-calculation-time-cpu-vs-cla

器件型号:TMS320F28069
主题中讨论的其他器件: C2000WARE

您好、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