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.

[参考译文] TMS320F280039C-Q1:CPU 无法在 PFC 控制的33.33us 中断中完成计算

Guru**** 2464570 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1483836/tms320f280039c-q1-cpu-cannot-finish-the-calculation-in-33-33us-interrupt-in-pfc-control

器件型号:TMS320F280039C-Q1

工具与软件:

嗨、专家

客户使用我们的 F280039开发 OBC 直流/直流、MCU 在 OBC 功率级中控制 PFC 和 CLLLC。

PFC 控制频率为30kHz、客户会发现、如果控制 ISR 在 CPU 中运行、则 PWM CMP 数据无法在33.3us 内更新(实际时间~36.5us)。 但是 CLA 可以在~27uS 内完成 ISR。

我们进行了以下检查:

启用了以下所示的处理器选项 FPU/ TMU:

下面所示的优化为放松模式、浮点模式允许编译器将 math.h sin/cos 替换为 TMU __sin/__cos

CPU 的组装如下所示:

 CLA 的汇编如下所示:

控制 ISR 中的指令为"if else branch"/"+"/"-"/"/""sin"/"cos"。

所有变量均使用 F 后缀写入、例如2.0写为"2.0f"。

我还可以采取其他措施来优化代码吗?

谢谢

Joe

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

    您好!

    我们关于这一主题的专家已离开办公室两周。 是否可以等待他的返程?  

    谢谢!

    Ben Collier

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

    你(Ben)好

    我认为专家可能是 Sira? 这是可以的, 我有一些解决办法,如减少一些"如果-否则-"分支,但仍然需要专家帮助来 调查根本原因.

    我稍后会跟进。

    谢谢

    Joe

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

    是的、好的、听起来不错。  

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

    你(Ben)好

    Sira 似乎回到办公室、您能帮忙将 E2E 主题重新分配给他吗?

    谢谢

    Joe

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

    您好、Joe。

    为项目指定了什么优化级别?

    您是否检查过 C28x 侧的分部是否使用了 TMU?

    对于你描述的运算、C28x 应该比 CLA 更快(或快一样)。

    他们能否共享代码?

    谢谢!

    SIRA

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

    您好、Sira

    抱歉、目前我没有 F280039 LP、但我对 F280049 LP 进行了以下测试:

    基本项目为: timer_ex1_cputimers 和 cla_sin、

     优化级别设置如下所示:

    测试1:在项目中" timer_ex1_cputimers" 我添加以下语句来计算512并使用 CPU TIMER0来记录时间:

    //对于(I = 0;I<10;I++)
    //{

    (j = 0;j<512;j++)

    sinf (TEST_INPUT[j]);

    }

    //}

    测试结果1:

    在 CPU 中进行512倍 sinf()计算需要17984个周期。

     在 CPU 中进行5120次 sinf()计算需要179456个周期。

    测试2:在项目"cla_sin "  在 CLAtask1中添加了相同的语句、在 Cla1ForceTask1andWait ()之前添加了 CPUTimer_startTimer ()、 在 WAITSTEP 后面添加了 CPUTimer_stopTimer ():

    测试结果2:

    在 CLA 中进行512乘以 sinf ()计算需要8011个周期。

     在 CLA 中进行5120乘以 sinf ()计算需要77416个周期。

    测试3:在项目"cla_sin "  我使用  以下在 CLA.task1中的语句、 CPUTimer_startTimer()是在 cla_forceTasks()之前 添加的、CPUTimer_stopTimer()是在 cla1Isr1()第一行添加的 :

    //对于(I = 0;I<10;I++)
    //{

    (j = 0;j<512;j++)

    x = i+j;
    // CLAsin (TEST_INPUT[j]);
    }
    //}

    测试结果3:

    512次需要10319个周期 +在 CLA 中进行计算。

     5120倍 +在 CLA 中进行计算需要102791个周期。 (CPU 使用77010个周期执行此操作)

    测试表明、sinf 在 CLA 中的运行速度比在 CPU 中更快。

    我的问题可以缩小到如何提高 sinf 的 CPU 运行效率?

    谢谢

    Joe

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

    Joe、

    查看优化设置、fp_mode = relaxed (即 goog)。 但是、优化级别(-opt_level)是关闭的。 这可防止生成 TMU 指令。 请至少将其更改为2。  

    谢谢!

    SIRA

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

    您好、Sira

    感谢您的指导、我将 优化级别(-opt_level)更改为2、这有助于显著减少 CPU 时间消耗。

    测试结果:使用--opt 级别2进行5120 sinf 计算的97485 timer0周期(使用--opt 级别关闭的179456)

    但编译器一开始就忽略我的测试代码、在变量声明前添加"volatile"后、该代码变得正常。 因此、我认为如果客户在成熟的项目中直接将--opt 级别改为2、他们可能会发现他们的程序性能会变成意外状态。  

    支持需求:

    您是否可以帮助建议用户在何时将更改--选择级别从"关闭"更改为" 2 "?

    或者用户不能只为 ISR 设置整个项目的--opt 级别吗?

    谢谢

    Joe

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

    您好、Joe。

    添加 volatile 会使编译器花费不必要的额外周期、因为它始终需要从存储器中读取/写入变量、并且无法执行寄存器优化。

    我们强烈建议不要使用 Volatile、除非它是绝对需要的(例如对于外设寄存器、或者对于在多个上下文中修改的变量、例如多个 ISR、或者 ISR 和后台循环)。

    我们始终建议至少在级别2为整个项目启用优化。

    对于您的特定问题、您应该确保所执行的操作实际上是"使用"、而不是使用 volatile。 一种方法是将 sinf 分配给某个全局变量并不断向其添加后续的 sinf。 最后打印该变量(在基准测试部分之外)。

    谢谢!

    SIRA

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

    您好、Sira

    感谢您的答复,我根据您的指导更改了基准代码,最终我可以看到5120 sinf 在 CPU 中消耗71782个 timer0计数, 在 CLA 中使用77416个 timer0计数,这与一致:

    对于您所描述的操作、C28x 应该比 CLA 快(或快得多)。

    此致

    Joe

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

    您好、Sira

    还有一个问题:

    优化级别(--opt_level)已关闭。 这可防止生成 TMU 指令。 请至少将其更改为2。  [报价]

    对此有何指导? 我找不到 SPRU514Z 3.1和3.16中关于--opt_level off 阻止生成 TMU 指令的确切陈述。

    谢谢

    Joe  

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

    Joe、

    同意、但没有提到这一点。 您能否看一下您的代码并检查 TMU 指令是否生成而优化关闭。

    谢谢!

    SIRA

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

    您好、Sira

    抱歉延迟、似乎在--opt_level off 和--opt_level 2中、调用了 TMU 函数_relaxed_sinf、反汇编视图中没有很大的差异?

    -- opt_level 关闭                                   -- opt_level 2.

    谢谢

    Joe

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

    Joe、

    这样就确认了这一点。 只要 FP_MODE =宽松、优化关闭时仍然会生成 TMU 指令。 但启用优化有助于提高其余代码的性能。

    谢谢!

    SIRA

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

    您好、Sira

    奇怪的是,有很大的周期差异与--opt 级别2和--opt 级别关闭,但无论如何,我将尝试一个单一 sinf ()计算再次查看时间成本。

    测试结果:使用--opt 级别2进行5120 sinf 计算需要97485个 timer0周期(使用--opt 级别关闭时为179456)

    谢谢

    Joe