PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : volatile, const



pebisoft
26.02.2005, 12:44
hallo,
"volatile" wird hier im forum immer falsch interpretiert.
"volatile" ist das gegenteil von "const". in volatile können
die variablen während des programmablaufes wechseln.
man macht die variablen damit kennbar. auch wenn es fehlt,
gibt es kein einfluss auf den programmablauf , es ist halt
nur ein feiner programmstil.
auch sagen einige, "sbi()" ist veraltet, ansichtssache sage ich.
mfg pebisoft

Minifriese
26.02.2005, 13:28
Moin moin!

Das volatile ist nicht immer nur feiner Programmierstil, manchmal geht es nicht ohne. Zum Beispiel, wenn man Variablen sowohl im "normalen" Hauptprogramm als auch in Interruptroutinen verwenden will. Ohne Volatile haut das naemlich nicht hin, wie ich neulich wieder mal festgestellt hab...

Und was soll man denn statt sbi() nehmen? Ich finde das ganz praktisch...

Nils

Arexx-Henk
26.02.2005, 14:14
Hallo Pebisoft,

endlich mahl Jemand der etwas uber 'volatile' bescheid weiss.

Vorbild:


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.


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

pebisoft
26.02.2005, 16:54
hallo und dieser feine programmierstil wurde hier in winavr aufgenommen,obwohl er von der commission noch nicht abgesegnet wurde. ich finde es aber trotzdem gut das er das programm jetzt beeinflusst. die programmierer von winavr halten dieses aber leider im dunkeln statt die info weiter zugeben. wenn ich das standard-c nehme hat es diese funktion, ist dort zugelassen und verändert aber nicht den code.
mfg pebisoft

pebisoft
27.02.2005, 10:57
hallo, was winavr durcheinander bringt mit "volatile" ist , das die variable "volatile" dann mit einer "0" belegt wird und ohne "volatile" ist eine zufallszahl drin.
mfg pebisoft

Arexx-Henk
27.02.2005, 12:21
Hallo Pebisoft,

Ich mochte es nochmal zusammenfassen um es fur michselbst gut zu verstehen.

In assemblercode werden registers r24/r25 benutzt um variabelen werte zu testen.

//hier wird 0x33 in r24 geladen und r24 nach myChar ram speicherplatz kopiert
myChar=0x33;

//Bei non-volatile wird angenommen das 0x33 sich noch immer in r24 bevindet und wird nur r24 abgefragt..
if(myChar){} while(myChar){}

//Bei volatile wird angenommen das 0x33 sich nicht mehr in r24 bevindet und wird zuerst speicherplatz myChar nach r24 kopiert und dann wird r24 abgefragt..
if(myChar){} while(myChar){}

'volatile' heisst 'fluchtig' dass heist die wert konnte sich inzwissen geanderd haben.

Zuzammengefasst:
non-volatile:
- neuwert von variable x wird nicht getestet
- anfangswert unbekannt
volatile:
- immer die neuwert von variabele x wird getestet
- anfangswert immer 0

Ich hab die anfangswert mit Asuro Robot ausgetestet und ist auch bei volatile und non-volatile immer 0 aber vielleicht macht das bootprogram eine ram initialisation.

Gruss

Henk

bluebrother
28.02.2005, 15:30
auch sagen einige, "sbi()" ist veraltet, ansichtssache sage ich.

wenn etwas als deprecated gekennzeichnet wird hat das einen immer Grund. Und die die den Compiler bauen wissen schon warum. Also was soll das dumme rumgetrolle hier? Sind wir jetzt schon im Heise-Forum oder was?

@Minifriese:
PORTC |= 1<<FOO;
Hat den massiven Vorteil dass du auch mehr wie ein Bit gleichzeitig setzen kannst.

Minifriese
28.02.2005, 16:14
Ist sbi() echt deprecated? War mir noch gar nicht aufgefallen. Naja, die Version mit dem Shiftoperator ist ja auch OK. Bei sbi() konnte man halt auf den ersten Blick sehen, was passiert. Die neue Version sieht etwas sperrig aus :-)

Thorsten
28.02.2005, 18:04
sbi() war halt ne spezielle funktion der avr-libc.
Mit foo |= 1<<bar ist es halt ansi c und damit portabler.
Und wie bluebrother schon gesagt hat, man kann mehrere bits
setzen, daher ist es jetzt flexibler.


Hab grad mal nachgesehen, in der aktullen Version (vom 15 Feb)
scheint sbi() schon rausgeflogen zu sein.

pebisoft
28.02.2005, 19:14
hallo, die den compiler bauen ,wissen es nicht immer, dort gibt es auch einpaar "dussel". auch wie torsten festgestellt hat,das das sbi() nicht mehr drin ist. auch gibt es einige "programmierdussel" im "avr-forum".
ich könnte diese sogar mit namen nennen, darf ich hier nicht.
mfg pebisoft

bluebrother
01.03.2005, 10:38
hallo, die den compiler bauen ,wissen es nicht immer

Genau. Aber du weisst es.
Warum gehst du nicht ins Heise-Forum zum rumtrollen?

bluebrother
01.03.2005, 10:41
ach ja:

auch gibt es einige "programmierdussel" im "avr-forum".

ist das hier ein Forum für den Austausch von Leuten die sich damit befassen oder sind hier nur "Profis" wie du zugelassen? Es ist auch immer mal wieder nervig wenn die selben Anfängerfragen zum 100sten Mal auftauchen, aber genau dafür ist das Forum doch gut.
Warum solltest du also jemand namentlich nennen können? *kopfschüttel*

KlausR
26.03.2005, 00:40
hallo,
"volatile" ist das gegenteil von "const". in volatile können
die variablen während des programmablaufes wechseln.


Jein. Das ist aber noch nicht alles. Volatile ist primär eine Kennzeichnung für den Optimiere im gcc, die angibt, dass eine Variable auch ausserhalb des regulären Programmflusses den Wert ändern kann, z.B. durch eine Interrupt-Routine oder weil die Variable auf ein Hardware-Register gemapt ist.
Volatile heisst für der Optimierer "don't touch".
Wenn eine Volatile Variable gesetzt bzw. abgefragt wird, wird diese Operation auch immer ausgeführt.

Beispiel:



int t;
t = 0;
if (t) {
// Wird vom Compiler idR wegoptimiert, da er erkennt, dass t=0 ist.
}

volatile int t;
t = 0;
if (t) {
// Wird nicht wegoptimiert
}


-Klaus

pebisoft
27.03.2005, 09:59
jein, das stimmt nicht alles, die variable wird nicht wegoptimiert, sie ist immer noch existens, bloss sie wird mi einer beliebigen zahl belegt, die einem bei der fehlersuche ganz schön zu schaffen machen kann.
mfg pebisoft

bluebrother
27.03.2005, 16:24
Argl! Ist das denn so schwer? KlausR hat doch ein gutes Beispiel gebracht.

Die Variable wird in seinem Beispiel an der Stelle "if(t)" wegoptimiert, weil t=0 und damit genauso "if(0)" stehen könnte.
Die Variable wurde ja deklariert und kann damit nicht einfach gelöscht werden (sio wie dein Beitrag impliziert). Aber an der angegebenen Stelle verschwindet die weil unnötig (aus Sicht des Optimierers).

pebisoft
27.03.2005, 16:53
er schreibt "in der regel", das heisst, es machen nicht alle winavr-versionen.
mfg pebisoft

muraad
27.03.2005, 17:40
Pepisoft die hamm schon recht.
Es wird auch nicht die Variable wegoptimiert sondern nur die if Anweisung oder for() Schleife etc.
Das die Variable ohne volatile unsinnige Wert bekommt ist auch nicht automatisch so. Das war nur in unserem Fall (srf04 Messung) so da wir der Variable Werte von Hardwareregistern zugewiesen haben
Und WinAVR programmiert niemand, das ist nur der GNU gcc Compiler von dem das abhängt.
Gruß Muraad