最近使用CCS6.0编译28335程序遇到一个比较诡异的问题:
(1)函数
long test_fun(long var)
{
int a[200];
a++;
return 0;
}
while(test_fun() == 0); 死循环条件不成立。
(2)
long test_fun(long var)
{
int a[20];
a++;
return 0;
}
while(test_fun() == 0); 死循环条件成立。
查看汇编,test_fun两者使用恢复栈的方式不一样,前者使用 ADD 恢复栈,后者使用SUBB 恢复栈。ADD 恢复栈会改变 st0 寄存器 z 位的值,while 条件判断是使用SBF指令跳转,依赖Z值,导致最终与预期结果不一致。
请问这个问题如何解决。
Green Deng:
你好,我会与相关工程师沟通后再给你答复。
,
Green Deng:
看一下这个资料是否有帮助:software-dl.ti.com/…/sdto_cgt_How-to-Submit-a-Compiler-Test-Case.html
,
user3993432:
全是CCS6.0的默认配置,优化关,工程默认生成的。
,
Green Deng:
目前没有其他的想法。如果方便的话你可以去英文E2E论坛咨询一下国外的工程师有没有类似问题:e2e.ti.com/…/c2000-microcontrollers-forum
,
user3993432:
compiler_bug.rar我简单的写了个工程,编译选项全在工程里面,可能还是要麻烦你们指导下了。
C 代码很简单:
/* * main.c */
long fun1(long a,long b){ int buff[200];
return 0;
buff[0] = a;}
long fun2(long a,long b){ int buff[20];
return 0;
buff[0] = a;}
int main(void){
if(fun1(1,2) == 0) { while(1); }
if(fun2(1,2) == 0) { while(1); } return 0;}
死循环停在第二个while(1),对用反汇编为
009046: _fun1:00009046 08ad ADD SP, #20200009047 00ca00009048 1e42 MOVL *-SP[2], ACC00009049 0200 MOVB ACC, #00000904a 6f01 SB 1, UNC00904b: $C$L1:0000904b 08ad ADD SP, #-2020000904c ff360000904d 0006 LRETR
00904e: _fun2:0000904e fe16 ADDB SP, #220000904f 1e42 MOVL *-SP[2], ACC00009050 0200 MOVB ACC, #000009051 6f01 SB 1, UNC009052: $C$L2:00009052 fe96 SUBB SP, #2200009053 0006 LRETR
009054: _main:00009054 fe02 ADDB SP, #200009055 0202 MOVB ACC, #200009056 1e42 MOVL *-SP[2], ACC00009057 0201 MOVB ACC, #100009058 7640 LCR 0x00904600009059 90460000905a ed02 SBF 2, NEQ00905b: $C$L3:0000905b 6f00 SB 0, UNC00905c: $C$L4:0000905c 0202 MOVB ACC, #20000905d 1e42 MOVL *-SP[2], ACC0000905e 0201 MOVB ACC, #10000905f 7640 LCR 0x00904e00009060 904e00009061 ed02 SBF 2, NEQ009062: $C$L5:00009062 6f00 SB 0, UNC009063: $C$L6:00009063 9a00 MOVB AL, #0x000009064 fe82 SUBB SP, #200009065 0006 LRETR
两处 红色SBF 指令均依赖ST0 寄存器的 Z 值,然而 绿色处的 ADD 指令会改变Z 值
,
Green Deng:
抱歉漏贴了。
我这边无法复现这个问题,当我build代码时,我总是看到指令:
TESTACC在LCR和SBF之间。也就是说,累加器中的值总是在调用之后和条件分支之前进行测试。
对于用于生成汇编代码的源文件,请按照文档“How to Submit a Compiler Test Case”中的说明进行操作。
TI中文支持网




