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_1
和 array_2
。
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 |
1 2 3 4 5 | SECTIONS{.array_a: >RAMGS2.array_b: >RAMGS3} |