工具/软件: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;