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.

[参考译文] TMS320F28388D:传统位域方法与驱动程序 API## 39;直接寄存器访问模型。 哪种方法在代码处理速度方面更高效?

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1222121/tms320f28388d-legacy-bit-field-approach-vs-driver-api-s-direct-register-access-model-which-approach-is-more-efficient-in-terms-of-code-processing-speed

器件型号:TMS320F28388D

您好!

我想知道在旧位字段方法和驱动程序 API 的直接寄存器访问模型之间的代码处理速度方面、哪一种更有利。

在下面的示例中、F28388D 的 GPIO 端口12由 GPASET 寄存器单独操作。 (已分别应用旧位字段方法和驱动程序 API 的直接寄存器访问模型。)

[位域方法]
时钟系统配置结果:4个周期

[驱动程序 API 的直接寄存器访问模型]
时钟曲线结果:2个周期

根据时钟配置文件结果、在独立操作寄存器的特定位时、驱动程序 API 的直接寄存器访问模型在处理速度方面似乎更有效。

我想知道这个结果是否正确。
基于代码处理速度、哪种方法更高效?

谢谢。此致、
Sang-il

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

    尊敬的  Sang-il:

    是的、这个结果对于您共享的代码片段是预期的。

    在基于 bitfield 的代码中、您将写入寄存器中的特定位。 编译器将执行读取-修改-写入操作。

    该寄存器 实际上是一个 R-0/W-0寄存器、这意味着它始终读为0、而写0被忽略。 Driverlib 利用这一点、对完整的32位寄存器进行写入操作、而不是进行读取-修改-写入操作

    HWREG (addr) = 0x100;而非  HWREG (addr) |=  0x100;

    要使用 bitfield 代码执行32位写入、可以按如下方式重写代码:

    GpioDataRegs.GPASET.all = 1<<位编号;

    此致、

    Veena

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

    您好、Veena:

    我知道旧的位字段方法(来自逐位访问)会生成原子指令(读取-修改-写入)。

    相反、驱动程序 API 的直接寄存器访问模型应用基于寄存器(MMR)地址的逻辑运算、因此我认为 C2000编译器会将其解释为非原子指令。

    因此、与驱动程序 API 的直接寄存器访问模型相比、我希望其(旧位字段方法)在代码处理速度方面更具优势。 我想知道我的预测是否正确。

    如果驱动程序 API 的直接寄存器访问模型也从逐位访问生成原子指令、则无需使用旧的位字段方法来优化代码吞吐量速度。

    我知道驱动程序 API 的直接寄存器访问模型具有逐位操作寄存器的宏,例如 HWREGBITW()或 HWREGBITW()。

    如果我使用这些宏、C2000编译器是否会像传统位字段方法那样将它们解释为原子指令?

    谢谢。此致、
    Sang-il

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

    尊敬的 Sang-il:

    这里的根本区别在于将读取-修改-写入指令与写入指令进行比较。 无论 使用位域还是 HWREG 宏、前者本身都具有延迟。

    如果您正在比较 以下代码片段、两者应该执行相似的周期

    GpioDataRegs.GPASET.bit.GPIO0 = 1;

    HWREG (addr)|= 1;

    GpioDataRegs.GPASET.all = 1;

    HWREG (addr)  =  1;  

    bitfields 方法使用数据页寻址、而 HWREG 方法使用直接寻址。 第一种方法在连续访问同一数据页时效率更高。

    此致、

    Veena

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

    我明白你的意思。
    感谢你的评分 祝你度过美好的一天!