ZHCUAQ1F july 2015 – april 2023
通过使用 MUST_ITERATE 和 _nassert,可确保循环执行特定的次数。
此示例告知编译器,确保循环可以正好运行 10 次:
#pragma MUST_ITERATE(10,10);
for (I = 0; I < trip_count; I++) { ...
MUST_ITERATE 还可用于指定循环计数的范围以及循环计数的系数。例如:
#pragma MUST_ITERATE(8,48,8);
for (I = 0; I < trip; I++) { ...
此示例告知编译器,循环执行 8 次到 48 次,循环变量是 8 的倍数(8、16、24、32、40、48)。编译器现在可以使用这些信息,通过展开尽可能地生成最佳循环,即使使用 --interrupt_thresholdn 选项指定中断每 n 个周期发生一次。
TMS320C6000 编程人员指南指出,改进 C/C++ 代码的方式之一是使用 word 访问来操作 16 位数据,它们存储在 32 位寄存器的高位和低位中。示例展示了通过内在函数使用特定指令(例如 _mpyh),来强制转换为 int 指针。可使用 _nassert()实现自动化; 内在函数指定 16 位短数组在 32 位 (word) 边界对齐。
下述示例生成相同的汇编代码:
int dot_product(short *x, short *y, short z)
{
int *w_x = (int *)x;
int *w_y = (int *)y;
int sum1 = 0, sum2 = 0, I;
for (I = 0; I < z/2; I++)
{
sum1 += _mpy(w_x[i], w_y[i]);
sum2 += _mpyh(w_x[i], w_y[i]);
}
return (sum1 + sum2);
}
int dot_product(short *x, short *y, short z)
{
int sum = 0, I;
_nassert (((int)(x) & 0x3) == 0);
_nassert (((int)(y) & 0x3) == 0);
#pragma MUST_ITERATE(20, , 4);
for (I = 0; I < z; I++) sum += x[i] * y[i];
return sum;
}
在 C++ 代码中,_nassert 是标准命名空间的一部分。因此,正确的语法是 std::_nassert()。