ZHCUAU3J January 2018 – March 2024
通过使用 MUST_ITERATE pragma,可以保证循环执行一定的次数。下述示例会告知编译器,循环保证可以正好运行 10 次:
#pragma MUST_ITERATE(10,10)
for(i = 0; i < iteration_count; i++) { ...
在此示例中,即使没有 pragma,编译器也尝试生成软件流水循环。但如果没有为这样的循环指定 MUST_ITERATE,编译器会生成代码绕过循环,以解决可能出现的 0 次迭代。利用 pragma 规范,编译器知道循环至少会迭代一次,可以消除循环绕过代码。
MUST_ITERATE 可用于指定迭代计数的范围,以及迭代计数的系数。下述示例会告知编译器,循环执行 8 次到 48 次,并且 iteration_count 变量是 8 的倍数(8、16、24、32、40、48)。倍数参数支持编译器展开循环。
#pragma MUST_ITERATE(8, 48, 8)
for(i = 0; i < iteration_count; i++) { ...
对于具有复杂边界的循环,应考虑使用 MUST_ITERATE。在下述示例中,编译器不得不生成一个除法函数调用,以便在运行时确定所执行的迭代次数。
for(i2 = ipos[2]; i2 < 40; i2 += 5) { ...
编译器不会执行上述操作。在这种情况下,使用 MUST_ITERATE 指定循环始终执行八次,编译器将尝试生成软件流水循环:
#pragma MUST_ITERATE(8, 8)
for(i2 = ipos[2]; i2 < 40; i2 += 5) { ...
通常,如果使用 MUST_ITERATE pragma 优化循环执行,则会在优化代码前附加 DINT 指令,执行循环代码后,循环终止时会执行 RINT 指令。