mordy 发表于 2007-9-16 16:01:08

winavr 编译中碰到一个奇怪的问题。高人请指点。在线等!!!!急!可能是WINAVR中的一个BUG

原码:
原意思是在定时中断中将t_v--;定时一毫秒进一次。

void Msdelay(UW ms)
{
        t_v=ms;
        while(t_v);
        PORTC=0xff;
        PORTA=0xff;
        PORTD=0xff;
        while(1);
}
对应.lss
void Msdelay(UW ms)
{
124:        90 93 44 01         sts        0x0144, r25
128:        80 93 43 01         sts        0x0143, r24
        t_v=ms;//此行没问题。
        while(t_v);//此行有问题。
12c:        00 97               sbiw        r24, 0x00        ; 0
(应该用t_v的地址里的数与0比较才对,这里用r24里的数比较,大家看有没有问题?)
12e:        f1 f7               brne        .-4              ; 0x12c <Msdelay+0x8>
        PORTC=0xff;
130:        8f ef               ldi        r24, 0xFF        ; 255
132:        85 bb               out        0x15, r24        ; 21
        PORTA=0xff;
134:        8b bb               out        0x1b, r24        ; 27
        PORTD=0xff;
136:        82 bb               out        0x12, r24        ; 18
138:        ff cf               rjmp        .-2              ; 0x138 <Msdelay+0x14>

0000013a <main>:
13a:        0e 94 49 00         call        0x92        ; 0x92 <Sysinit>
13e:        82 e0               ldi        r24, 0x02        ; 2
140:        90 e0               ldi        r25, 0x00        ; 0
142:        0e 94 92 00         call        0x124        ; 0x124 <Msdelay>
146:        fb cf               rjmp        .-10           ; 0x13e <main+0x4>

00000148 <__vector_1>:
        while(1);
}

ghost2 发表于 2007-9-16 16:28:32

r24里存的是ms,while(t_v)等同于while(ms),所以把r24和0比较,就是t_v和0比较。
楼主要想让程序按照自己想法运行,恐怕得好好复习一下volatile的用法

mordy 发表于 2007-9-16 16:38:52

非常感谢GHOST2,在变量前加volatile就OK了。 。。。。不过该程序用ICC编译完全正常。没想到WINAVR有这要求。
该贴申请关闭!

ghost2 发表于 2007-9-16 17:22:25

你进一步看看GCC有没有打开优化。没开的话应该和IIC差不多
页: [1]
查看完整版本: winavr 编译中碰到一个奇怪的问题。高人请指点。在线等!!!!急!可能是WINAVR中的一个BUG