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.

[参考译文] 编译器:clpru 2.2.1:代码时序、优化器、__delay_cycles()

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/695698/compiler-clpru-2-2-1-code-timing-optimizer-__delay_cycles

工具/软件:TI C/C++编译器

我有这样的代码:
[A]__R30 = Ctrl;
[b] myvar =(myexpr); // 4个周期
[c]__delay_cycles (4);// 4个周期
[D]结果=__R31;// 8个周期延迟

点[D]必须为40ns = 8个周期、然后是[A]。
为了避免浪费时间、我将一些计算移到了[B]。
[b]为4个周期、因此这一直有效、直到优化器"clpru -O3"在[A]之前移动了[B]。
执行[B]、[A]、[C]、[D]仅为4个周期、因此错误。

问题:
-如何临时禁止[A]和[D]之间的代码再次订购?
-可以保证优化器始终允许 __delay_cycles ()保持在[A]和[D]之间?

可能这是一个潜在的目标冲突:PRU 应在确定性时序中执行代码、但优化器可能会对所有内容进行扰频。

建议:制作一对包含两 个 iniscs __delay_start()和__delay_end()的内部函数,这两个函数会告诉编译器我需要延迟的点:
然后优化器可以相应地排列代码。

__DELAY_START();
 _R30 = Ctrl;
 myvar =(myexpr);  
 __DELAY_END (8);//需要从__DELAY_START()到这里的8个周期
结果=__R31;

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

    感谢您提请我们注意此问题。  为了解决这个问题、我在 SDOWP 系统中提交了 CodeGen-4843。  此条目不会报告错误、但会请求对编译器进行改进。  此时、我避免提出问题解决方案。  我的重点是明确说明需要什么。  这就是为什么我把这个条目命名为...

    创建将易失性访问分开 N 个周期的方法、同时用有用的指令填充这些周期。

    欢迎您在我的签名中使用下面的 SDOWP 链接关注此条目。

    谢谢、此致、

    乔治