Hallo Pebisoft,
endlich mahl Jemand der etwas uber 'volatile' bescheid weiss.
Vorbild:
Code:
main(){
enable_timer0_overflow_interrupt;
flag=1;
while(flag){
}
}
timer0_overflow_interrupt_handler{
flag=0;
}
wenn flag wie 'unsigned char' definiert wird bleibt dass Program im 'while' Schleife hangen.
wenn flag wie 'volatile unsigned char' definiert wird verlasst dass Program die 'while' Schleife sofort wenn ein timer0 interrupt geschied.
Hier die compilierten listings.
Code:
Im Programlisting seht mann bei 'unsigned char'
ldi r24,lo8(1) //lade 0x01 in register 24
sts flag,r24 //kopier register 24 in variabele 'flag'
.L2 //label L2
tst r24 //test register 24
brne .L2 //so lange 'register 24' nicht null is gehe zuruck nach label .L2
Im Programlisting seht mann bei 'VOLATILE unsigned char'
ldi r24,lo8(1)
sts flag,r24
.L2
lds,r24,flag //hier wird immer aufsneu 'flag' in register 24 kopiert
tst r24
brne .L2
Jetzt an hand diene Aufmerkung verstehe Ich volatile (Ich hatte Gestern zufallig mein 'flag' Problem als Frage im AVR-C Forum deponiert.
Register r18, r19, r24 und r25 werden immer bei einem function-anruf auf dem Stack plaziert und nachher wieder zuruck geseztz.
Thanks!
Gruss
Henk
Lesezeichen