On Fri, Sep 28, 2007 at 11:26:43PM +0530, Royce Pereira wrote:
> Hi all,
> 
> OK fine I agree.
> 
> we have to use 'volatile' and all.
> 
> But why must it generate such horrid code...

There are those here who would tell you that any calibrated delay loop
is horrible code.

The stack has to be protected when space is being allocated, believe
this is normal for any auto variable allocation because the registers
being used to offset the stack are the same the runtime will use to
process an interrupt. Notice the SREG is restored in the middle of
updating the stack pointer? This is because the next instruction is
already in the pipe and can't be interrupted.

Make it "static volatile" for simpler code. The other was nasty because
it had to access stack-relative, and because it was volatile it *had* to
be fetched and stored each time.

void delay_loop(unsigned int delay)
{
  ba:   90 93 01 01     sts     0x0101, r25
  be:   80 93 00 01     sts     0x0100, r24
        static volatile unsigned int vdelay;

        vdelay = delay;
        while( vdelay-- )
  c2:   80 91 00 01     lds     r24, 0x0100
  c6:   90 91 01 01     lds     r25, 0x0101
  ca:   01 97           sbiw    r24, 0x01       ; 1
  cc:   90 93 01 01     sts     0x0101, r25
  d0:   80 93 00 01     sts     0x0100, r24
  d4:   80 91 00 01     lds     r24, 0x0100
  d8:   90 91 01 01     lds     r25, 0x0101
  dc:   8f 5f           subi    r24, 0xFF       ; 255
  de:   9f 4f           sbci    r25, 0xFF       ; 255
  e0:   81 f7           brne    .-32            ; 0xc2 <delay_loop+0x8>
  e2:   08 95           ret

-- 
David Kelly N4HHE, [EMAIL PROTECTED]
========================================================================
Whom computers would destroy, they must first drive mad.


_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to