2.4.7.包含两个存储器操作数的指令的数据分配

C2000 ALU 上的许多指令采用存储器操作数,这意味着它们可以直接对存储器中的数据进行操作,而无需从寄存器进行加载和存储。

对于采用 2 个存储器操作数的指令,第二个存储器操作数 (*XAR7) 使用程序存储器总线。C2000 RAM 块仅支持在单个流水线周期内对存储块进行一次访问。为避免流水线停顿,应将数据阵列分配给不同的物理 RAM 块。物理 RAM 块可以在器件数据手册的存储器映射中找到。

以下指令使用程序存储器总线通过 *XAR7 进行第二次存储器访问:

  • MAC
  • IMACL
  • QMACL
  • DMAC
  • MACF32(仅 FPU
  • PREAD

表 2.11 显示了用于将 2 个数组相乘并累加结果的 C 源代码。使用 -O3--unified_memory,编译器会生成 RPT,与循环的 MAC 指令并行。MAC 指令有 2 个存储器操作数,分别对应 array_1array_2

表 2.11 带有 2 个存储器操作数的 MAC 指令
C 源代码 生成的汇编代码
int32_tmac(int16_t*array1,int16_t*array2,int16_tM){_nassert(M>0);intj;int32_tsum=0;for(j=0;j<M;j++)sum+=array1[j]*array2[j];returnsum;}
||mac||: MOVL XAR7,XAR5 ADDB AL,#-1 MOVZ AR5,AL MOV P,#0 MOVB ACC,#0 RPT AR5 || MAC P,*XAR4++,*XAR7++ ADDL ACC,P LRETR

表 2.12 比较了 F28004x 在将阵列放置在相同和不同存储器块中时的性能。两种情形都使用相同的编译器选项:-v28--abi=eabi--unified_memory--ramfunc=on-O3--opt_for_speed=5列表 2.1 说明了如何将 2 个数组放置在不同的物理存储块中。

场景 周期数
链接器 cmd 文件将两个数组放在同一个存储器块中 141
链接器 cmd 文件将两个数组放在不同的存储器块中 77
列表 2.1 链接器命令文件
1 2 3 4 5
SECTIONS{.array_a: >RAMGS2.array_b: >RAMGS3}