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.

[参考译文] TMS320F28384S:PWM driverlib 函数调用的性能

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1138137/tms320f28384s-performance-of-pwm-driverlib-function-call

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

尊敬的 TI 团队:

我们使用的是 C2000Ware_4_01_00_00中的28384S 处理器和 driverlib、而 driverlib 的性能似乎很慢。

背景:我们在数十 kHz 频率下运行一个非常高的速度控制环路。  在引入 driverlib 之前的先前项目中、我们将通过直接写入 EPwm1Regs.CMPA.all = count 等 ePWM 寄存器本身来设置占空比的计数。  现在、对于 driverlib、我们通过调用 ePWM_setCounterCompareValue 来实现这一点。

运行测试以设置 10个 PWM 寄存器、如下所示:

HWREGH (EPWM5_base + EPWM_O_CMPA + EPWM_COUNTER_COMPARE_A + 0x1U)= myCountForDutyCycle

ePWM_setCounterCompareValue (EPWM5_base、ePWM_O_CMPA、myCoutForDutyCycle);

10次直接写入需要~270nsec 、而对 driverlib 函数的10次调用需要~1.8usec、基本上是计时增加6倍。

我们是否正确使用了 driverlib?

我们是否在该 库的优化方面遗漏了一些东西?  

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

    拉斐尔

    很抱歉耽误您的回答。 印度的一些网页维护活动和假期推迟了答复。

    这是正确的实现方式。 我没有关于 bitfield 和 driverlib 的确切比较表、但由于 driverlib 有一些额外的检查、因此预计会出现时序差异。 我需要检查 bitfield 和 driverlib 实现之间的更好比较。 我将进行检查、并返回给您。

    除此之外、我肯定会建议您考虑、如果操作对时间至关重要、最好使用您之前使用的方法。

    Aditya

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

    此外、您是否使用了任何优化选项? 我们在 driverlib 代码内部只使用了一个额外的断言检查、当您使用发布模式而不是调试时、此检查无论如何不会影响最终代码。

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

    您好、Aditya、

    上述测量是在针对速度进行了全面优化的版本构建中完成的。

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

    您能不能澄清编译器的优化、例如、 O1、O2等?

    您可以参阅优化指南:  4.2.优化级别—《C2000 C28x 优化指南》

    您可以尝试使用 O2优化级别。 当优化关闭时、与直接 HWREG 调用相比、函数调用的数字将关闭。

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

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

    您能帮 Rafael 优化一下吗?

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

    您好、Rafael、

    我查看 了 ePWM_setCounterCompareValue 的函数实现、它涉及 if/else 条件。

    如果 传递的参数是常量、编译器将对其进行优化并完全删除 IF 条件。 但是、在您的情况下、它是一个变量、因此会有一个比较和一个分支。 一个分支需要4个周期。 +个周期、用于 比较、偏移计算

    您可以查看生成的汇编代码以了解更多详细信息

    我相信您没有在预定义符号下设置调试宏。 如果置位、则还包括断言检查。

    此致、

    Veena

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

    正确、我们不使用调试宏。

    我自己运行测试以验证先前向我报告的数字。

    测试逻辑

    设置 GPIO 进行测量

    ePWM_setCounterCompareValue (base、 counterCompareModule、count);

    (笑声) 另有9个调用到不同的基极、比较模块和计数以确保未进行优化。

    清除 GPIO 以进行测量

    这需要~1.9 μ s 才能运行。

    然后继续  

    设置 GPIO 进行测量

    HWREGH (base + registerOffset + 0x1U)= compCount;

    (笑声) 之后是另外9个具有不同数据的器件、以确保其不会得到优化

    清除 GPIO 以进行测量

    这需要~514nsec --不像以前报告的~270nsec 那样剧烈,我认为之前的测试正在优化一些代码。

    这些结果 确认、调用 driverlib API 来设置此计数器比较值所需的时间几乎是直接向寄存器写入的时间的4倍。

    为了提高性能、听起来我们需要直接写入。

    HWREGH 是正确的方法、还是最好在器件支持文件下包含.h 文件并使用 EPwm1Regs.COMPA.all = value 方法?  推荐什么?

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

    目前、我们的项目仅使用 driverlib 来设置/控制硬件。

    但是、如果我必须执行直接寄存器写入操作才能获得最佳性能、那么我们似乎 需要包含来自器件支持的文件:

    C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f2838x\headers\include

    这是 获得 最大性能的唯一方法吗?

    或者我是否缺少其他东西?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="220216" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1138137/tms320f28384s-performance-of-pwm-driverlib-function-call/4362187 #4362187"] HWREGH 是正确的选择、还是最好在器件支持文件下包含.h 文件并使用 EPwm1Regs.COMPA.all = Value 方法?  推荐什么?[/报价]

    在对 driverlib 与直接寄存器访问进行性能分析时,我们观察到的一些情况:

    1) 1)大多数 driverlib 函数都是内联函数、涉及无条件直接写入寄存器。 在这种情况下、driverlib 和 HWREG 所需的周期数完全相同

    2) 2)内包含条件分支的内联函数-这里有2种情形 :如果输入参数是常量,编译器足够智能,可以完全删除条件分支并直接写入所需的寄存器。 周期将保持不变。 但如果编译器不知道输入参数、则必须执行条件分支、从而导致更多周期

    比较 HWREG 与位域方法-

    1)性能: 编译器对 HWREG 和位字段使用不同的寻址模式。 我们已经看到、在 从同一外设对寄存器进行背靠背访问的情况下、位字段的工作效果会更好

    2)简便易用:在我个人看来,比特域代码比 HWREG 更干净、更直观

    3)安全标准方面 :如何在结构中打包位字段取决于编译器,而 C 标准中没有对此进行说明。 对于 C2000器件、TI 提供了单个编译器。 因此、这可能不是问题。 但我不确定是否在任何安全标准中禁止使用位字段。 我相信 MISRA 标准状态不会使用位域实现中使用的联合体

    [引用 userid="220216" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1138137/tms320f28384s-performance-of-pwm-driverlib-function-call/4362204 #4362204"]

    C:\ti\c2000\C2000Ware_4_01_00_00\device_support\f2838x\headers\include

    [/报价]

    除了这些头文件之外、您还需要添加 globalvariabledefs.c 和 cmd 文件、以便将结构分配到正确的存储器地址

    此致、

    Veena

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

    您好、Veena、

    感谢您提供的信息。

    我 想确保我没有错误地使用该库、或者缺少一个简单的优化该设置。

    我一直怀疑、由于我们的控制序列速度很高、我们必须保留寄存器直接访问权限。

    同意您的建议、即使用位字段访问更干净、代码可读性更高。

    谢谢你。

    拉斐尔