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:与内存处理、内存块或结构的数据传输相关的 TMS320F28388D 代码优化(与编译器和/或链接器相关的问题?)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1364390/tms320f28388d-tms320f28388d-code-optimization-related-to-memory-handling-data-transfers-of-memory-blocks-or-structs-issues-related-to-compiler-and-or-linker

器件型号:TMS320F28388D

尊敬的 TI 专家:

在 尝试迭代以提高 TI 工具(C/C++ 编译器/链接器)生成的最终汇编代码的效率之后 、我没有找到相关选项和系统设置(编译器、链接器、C28x...)的适当组合 以实现足够快的数据传输(效率通过 执行这些广泛使用的操作所需的 CPU SYSCLK 周期数进行测量)。

事实上、我们被迫 将数据接口缩减到16位宽的 EMIF 接口(作为在我们的 ECS 中集成互联网接口的折衷方案)。 当然、还存在与 EMIFx 数据接口的异步字符相关的其他(加重)问题。  

 当在内部寄存器之间或寄存器与内部存储器和寄存器之间运行时、有许多可用的 CPU 性能改进功能、例如许多算术/逻辑1-2周期(读取/测试和修改/写入)指令、这些指令利用了新的 C2000系列 MCU 基础架构提供的一些增强功能(包括自动后增量、后减量寻址选项)。 但是、 当源数据和目标数据都位于未寄存器分配的存储器位置时、任何此类指令都不会提供类似的性能。

例如、使用 EMIF16接口、在存在存储在外部存储器位置的外部数据块的情况下
(例如、具有包含即时 ADC 结果的连续地址的缓冲器、通过 集成在同一 PCB 上的额外独立控制的外部相邻 DAQ 子系统和/或其独立计算的后处理衍生器件来获取)
应立即(尽快)传送到 MCU 芯片内的数据存储器
(例如、分配给任一 C28x 内核的 GS 或 LS 存储器)   

每次此类传输都 需要大量的 CPU 周期、其中的大部分时间 似乎已浪费掉、因为 在此期间 MCU 的 C28x 内核
不执行任何其他有用的任务(根据 C/C++生成的汇编代码)。

例如、8个字的数据块(16位数据)需要超过 170个周期(平均值)
   当 CPU 总负载达到75%或者更多一点时、执行性能会进一步下降。

此外,事实证明,只有在最高优先任务上执行数据块传输操作时,才能保证数据的一致性(数据块传输中的数据)。

是否有机会  为 TI C2000编译器/链接器采用一些高级选项/开关来提高此类实际"存储器到存储器"数据传输的性能?

由于讨论了连续地址、如果(对于上述数据块传输示例)仅 进行4个 EMIF 传输(如有必要、4×32位数据在内部分离为高/低字)、将提高性能
而不是两倍以上的 EMIF 数据传输(8×16位数据)-两者都使用 EMIF16数据接口?

此外、除了 DMA 之外、您建议什么来优化内部外设(内部 ADC、SDFM 子系统、ePWM...)之间的数据交换性能
和 C28x 内核(也最好适用于两个 CLA 内核)?

是否有任何方法 指示(预)编译器最大限度地使用"原子指令"( 尽可能识别/实现更多原子指令、即在适用时)?

有什么特殊原因为什么汇编 RPT 命令只能处理一条指令(而不是至少两条指令、在这种 情况下、我强烈认为可以解决前面提到的很多 CPU 代码执行效率问题)?

这都是为了知道。 我们期待您的下次再见。  提前感谢。

时间很重要(尤其是实时嵌入式控制系统的执行时间),因为它总是:-)

此致

Nenad Težak ć

页 S:听起来可能很奇怪、从目前的角度来看、似乎 F28388D 的 CPU 性能与 C/C++生成的汇编  代码相比明显落后于 F28335!?
它是否与特定功能块(每个功能块都以 C/C++编写、然后编译/转换/链接到执行汇编)之间不太高效的输入/输出数据参数传递/交换有关?

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

    您的帖子涵盖多个不同的主题。  我 无法 回答所有这些问题。  请选择一个主题进行重点介绍。   

    如果主题如...

    我们被迫 将数据接口缩减为16位宽的 EMIF 接口

    ...是最感兴趣的,然后我会请其他专家帮助。

    如果感兴趣的主题可以表示为一些表现不佳的 C 代码、那么我可能会有所帮助。  有关包含此代码的源文件、 请按照 如何提交编译器测试用例一文中的说明进行操作。  指明问题在源中的开始和停止位置。  函数的名称也许是有意义的。  或者添加注释或许有道理、 /*这里有问题*/

    谢谢。此致、

    -乔治

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

    您好、George、

    您刚才提到的第一个"关注主题"(关于 EMIF16接口的使用)刚刚被包括在内以为实际关注主题(代码优化问题...)添加额外的信息(上下文)。 但是、在介绍尽可能提高 F28388D 内 C28x 内核的 CPU 性能的原则(推荐实践方法)时、有几个问题。在访问 E2E 站点之前、我已经咨询了我可以找到的所有可用特性(包括 C28x 扩展指令集、C/C++优化 LTS 指南、与此主题相关的 TI 技术讲座材料)、 但我尚未找到尽可能利用"原子指令"的编译器/链接器选项、以及有关原子指令使用的其他一些"提示和技巧"、这些使用可能有助于提高 F28388D 内 C28x 内核的 CPU 性能...)、从而至少消除 F28388D 的性能滞后(在200MHz 下操作并采用由 TI C/C++编译器/链接器创建的汇编代码(在 F28335下手动操作)、150MHz 编译器和链接器后手动优化的组合) F28335 MCU 中 C28x 代码的汇编代码。 当两个位置(源和目标不是内部 MCU 寄存器)都发生时、与传输 o 数据块相关的特定存储器复制问题、我会要求我的同事提供 C/C++和生成的汇编代码、以便提交测试用例。

    此致

    内纳德