ZHCU876Z July 2001 – October 2023 SM320F28335-EP
可以使用 __dmac 内在函数迫使编译器生成 DMAC 指令。在这种情况下,务必确保数据地址为 32 位对齐。
void __dmac(long *src1, long *src2, long &accum1, long &accum2, int shift);
有关 __dmac 内在函数的详细信息,请参阅表 7-6。
示例 1:
int src1[2N], src2[2N]; // src1 and src2 are int arrays of at least size 2N
// You must ensure that both start on 32-bit
// aligned boundaries.
{...}
int i;
long res = 0;
long temp = 0;
for (i=0; i < N; i++) // N does not have to be a known constant
__dmac(((long *)src1)[i], ((long *)src2)[i], res, temp, 0);
res += temp;
示例 2:
int *src1, *src2; // src1 and src2 are pointers to int arrays of at
// least size 2N.User must ensure that both are
// 32-bit aligned addresses.
{...}
int i;
long res = 0;
long temp = 0;
long *ls1 = (long *)src1;
long *ls2 = (long *)src2;
for (i=0; i < N; i++) // N does not have to be a known constant
__dmac(*ls1++, *ls2++, res, temp, 0);
res += temp;
在这些示例中,res 保存了 长度为 2*N 的 int 数组的乘法累加运算的最终和,同时执行两次计算。 。
此外, 必须使用优化级别 >= -O2 来生成有效的代码。此外,如果 这些示例的循环体中没有其他内容,编译器会生成 RPT || DMAC 指令,从而进一步提高性能。