TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28335 使用CCS6.0编译问题

最近使用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”中的说明进行操作。

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28335 使用CCS6.0编译问题
分享到: 更多 (0)