工具/软件:TI C/C++编译器
我想将 CLARAM 数据输出到 EMIF2数据。
我编写了如下 CLA C 源代码。
#define WRITE_SIZE (31)
中断 void Cla1Task7 (void){
Int16 S16_I;
int16 *s_ptr;
volatile Int16 * d_ptr;
S_ptr =(int16 *)(&(claram.top));
D_PTR =(volatile Int16 *) EMIF2_ADDRESS;
对于(S16_I = 0;S16_I < WRITE_SIZE;S16_i++){
*D_PTR++=*s_PTR++;
}
}
此代码仅复制4个数据、而不是我预期的31个数据。
我更改 WRITE_SIZE 的数量、然后得到各种结果。
WRITE_SIZE = 32、29、28正常(复制了完整数据)
wirte_size=31 (仅为4个数据)、33、30、27 (仅为3个数据)为 NG。
我检查汇编器代码、可能会发现此错误的原因。
[NG 案例]
在这种情况下、汇编器代码由每3个数据移动 N 次循环组成。第三个数据移动代码和循环末尾的比较代码混合如下。
MCMP32 MR2、MR1
MMOVZ16 MR0、* MAR1[#1]++
MMOV16 * MAR0[#1]++、MR0
MMOV16 @_CLA_scratchpad_start、MAR0
MNOP
MNOP
MMOVZ16 MR0、@μ_CLA_scratchpad_start
MBCNDD $C$L1、NEQ
MCPM32的结果使用 MBCNDD。 但是、MCPM32之后的 MMOVZ16具有更改状态标志的位置。 如果 CLARAM 数据为0、则设置 Z 标志、MBCNDD 出错。
[确定案例]
在这种情况下、汇编器代码由每2个数据移动 N 次循环组成。 第2个数据移动代码从循环的代码末尾分频。
MMOVIZ MR2、#0
MMOVZ16 MR0、* MAR1[#1]++
MCMP32 MR2、MR1
MMOV16 * MAR0[#1]++、MR0
MMOV16 @_CLA_scratchpad_start、MAR0
MNOP
MNOP
MMOVZ16 MR0、@μ_CLA_scratchpad_start
MBCNDD $C$L1、NEQ
在 MCMP32和 MBCNDD 之间没有改变状态标志的代码、所以这个代码正常运行。
我使用了 TI 编译器 v6.2.8、优化选项为-O3 -opt_for_speed=5。
这是已知的错误吗? 我应该使用最新的编译器吗?