[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-gcc-list] Is this a Bug??????
From: |
Lorne Gutz |
Subject: |
[avr-gcc-list] Is this a Bug?????? |
Date: |
Wed, 31 Jul 2002 08:21:17 -0400 |
This C code produced the assembler below. The 2
write bits to PORTB are just added to help me
identify the code in assmebler.
C code
_________________________________________
cbi( PORTB, 0 ); // sos send
while( timer_flag == 0 ); //wait for timer
cbi( PORTB, 1 ); // seakey send
In the assembley code, the variable 'timer_flag'
gets put into register r24 and then gets tested
repetedly. The value of timer_flag never gets
reloaded into r24 the program hangs.
assemble code
______________________________--
/* #NOAPP */
lds r24,timer_flag
.L28:
/* #APP */
cbi 24,0
/* #NOAPP */
.L37:
tst r24
breq .L37
/* #APP */
cbi 24,1
/* #NOAPP */
ldi r24,lo8(0)
rjmp .L28
The value of timer_flag is being incremented in an
interrupt ISR which works fine.
SIGNAL( SIG_OUTPUT_COMPARE1A )
{
extern uint8_t timer_flag;
timer_flag++;
}
and the assembler code of this function shows that
timer_flag is being incremented.
assemble code of ISR
_____________________________________
lds r24,timer_flag
subi r24,lo8(-(1))
sts timer_flag,r24
Well then I figured out a work around. I declared
timer_flag as volatile, and BOB's your uncle, it
works. Take a look at the assmebler code now.
it reloads r24 before it tests for zero.
_____________________________________________
.L37:
/* #APP */
cbi 24,1
/* #NOAPP */
.L47:
lds r24,timer_flag
tst r24
breq .L37
sts timer_flag,__zero_reg__
rjmp .L28
Well another long days work on the AVR
cheers
Lorne
avr-gcc-list at http://avr1.org
- [avr-gcc-list] Is this a Bug??????,
Lorne Gutz <=