www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variable extern volatile?


Autor: Heike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
sorry für die Anfängerfragen, doch als was muss ich eine Variable 
bezeichnen, die ich in 3 verschiedenen C-Files nützen möchte und die ich 
in einer Funktion ändern kann und gleichzeitig soll die Änderung dieser 
Variablen auch für die anderen C-Files gelten?

Deklariere ich sie dann in einem Headerfile als
extern volatile int16_t a;


Und in den Funktionen, wo diese Variablen genutzt wird nochmal als
volatile int16_t a;

Ist doch unsinn so, oder??

Wie macht man es wirklich?

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile weist den Compiler darauf hin,dass sich die Variable außerhalb 
des Programmflusses ändern kann.
Bsp:
char a;
c=a+b;
d=a+e;
f=a+g;

ohne volatile wird angenommen a ändert sich nicht, somit kann wenn a in 
irgendeinem Register bleibt, dieses ohne Nachladen gleich verwendet 
werden.
mit volatile MUSS es nachgeladen werden, da es sich z.B. durch einen 
Interrupt geändert haben könnte.
Wenn du also volatile deklarierst, dann für alle C Files, da du mit der 
Deklaration in einem C-File bestimmst wie es innerhalb DIESES C-Files 
behandelt wird. Dies gilt allgemein für GLOBALE VARIABLEN.

Du schreibst:
>Und in den Funktionen, wo diese Variablen genutzt wird nochmal als
>volatile int16_t a;

Wenn das innerhalb einer Funktion ist, dann sind unterschiedliche 
Variablen gemeint! Du solltest in einem C-Buch Dir nochmals den 
Unterschied zwischen globalen und lokalen Variablen durchlesen.

Autor: Sven DerSchreckliche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also "volatile" muss eine Variable nur deklariert werden, wenn sie per 
Interrupt geändert wird. Ansonsten ist das nicht nötig.

Ich gehe mal davon aus, daß Du keine parallel-laufenden Prozesse, 
sondern ein stinknormales C-Programm hast.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also "volatile" muss eine Variable nur deklariert werden, wenn sie per
> Interrupt geändert wird.
Das stimmt so nicht ganz. "volatile" muss nur dann verwendet werden, 
wenn die Variable in einer ISR und im Hauptprogramm verwendet wird. 
Bei Variablen, die nur in einer ISR verwendet werden, kann man das 
"volatile" auch weglassen. Das nur als ergänzende Information...

Autor: Sven DerSchreckliche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt geht die Erbsenzählerei wieder los:

1.Selbstverständlich habe ich damit seine im Hauptprogramm verwendete 
Variable gemeint. Mitdenken hilft manchmal...

2."Bei Variablen, die nur in einer ISR verwendet werden, kann man das
"volatile" auch weglassen..."
Stimmt so eben nicht. Was, wenn der Compiler die Variable ändert, aber 
nur im Register belässt ohne abzuspeichern, weil sie anschließend wieder 
gändert wird?

Autor: Sven DerSchreckliche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oops...Entschuldigung. Nicht "seine", sondern "ihre"

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven DerSchreckliche wrote:

> 2."Bei Variablen, die nur in einer ISR verwendet werden, kann man das
> "volatile" auch weglassen..."
> Stimmt so eben nicht. Was, wenn der Compiler die Variable ändert, aber
> nur im Register belässt ohne abzuspeichern, weil sie anschließend wieder
> gändert wird?

Das ist kein Problem.
Spätestens wenn die Funktion beendet ist muss der Compiler
alle Variablen in den Speicher zurückschreiben.

Anders kriegt er so manch andere C Forderung nicht hin.



Autor: Sven DerSchreckliche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz

Achja? Und was, wenn die Funktion lange dauert und die Werte 
zwischendrin eben doch von Interesse sind? Dann hab ich halt eben Pech 
gehabt, oder wie?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was heißt da "zwischendrin"? In C gibt es kein "zwischendrin" - was Du 
beschreibst, kann allenfalls auf den (mehr oder weniger) gleichzeitigen 
Zugriff einer Interruptroutine und eines Hauptprogrammes auf eine 
Variable zutreffen.
Dann ist -und das wurde hier bereits deutlich genug beschrieben- das 
Schlüsselwort "volatile" dringend angesagt.

Autor: Sven DerSchreckliche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rufus
Was soll denn der Mist? GENAU DAS hab ich ja geschrieben!!
Lesen hilft!! Hauptsache mal rumgemeckert!!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach? Dann hast Du aber den Text von Karl Heinz nicht richtig gelesen. 
Und so reiche ich Deine unnötig vielen Ausrufungszeichen und den 
unverschämten Tonfall an Dich zurück.

Wird eine Variable nur in einer ISR verwendet (also nicht außerhalb) ist 
-wie Karl Heinz völlig zu recht angemerkt hat- volatile NICHT 
erforderlich.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly wrote:
> Ach? Dann hast Du aber den Text von Karl Heinz nicht richtig gelesen.
> Und so reiche ich Deine unnötig vielen Ausrufungszeichen und den
> unverschämten Tonfall an Dich zurück.
>
> Wird eine Variable nur in einer ISR verwendet (also nicht außerhalb) ist
> -wie Karl Heinz völlig zu recht angemerkt hat- volatile NICHT
> erforderlich.


anmerken möchte ich noch, dass nicht ich das angemerkt habe :-)
sondern johnny.m

Autor: Sven DerSchreckliche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, und deshalb habe ich zwischen "verändern "und "verwenden" 
unterschieden. Aber lass gut sein...Du bist der Beste hier...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven DerSchreckliche wrote:
> Lesen hilft!! Hauptsache mal rumgemeckert!!

Das kann ich nur zurückgeben.

Autor: Sven DerSchreckliche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lol...Jungs, schickt mir bitte Eure Adresse. Möchte Euch so gerne einen 
Euro für ein Kindereis spendieren...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach komm Sven.

Du hast eine Aussage getätig ...

> Also "volatile" muss eine Variable nur deklariert werden, wenn sie
> per Interrupt geändert wird.

... die so auch ok ist.

johnny.m hat sie dann präzisiert ...

> Das stimmt so nicht ganz. "volatile" muss nur dann verwendet
> werden, wenn die Variable in einer ISR und im Hauptprogramm
> verwendet wird. Bei Variablen, die nur in einer ISR verwendet
> werden, kann man das "volatile" auch weglassen. Das nur als
> ergänzende Information...

... für den Fall, dass es sich um eine Variable handelt
die ausschliesslich in einer ISR (und nur dort) verwendet
wird. Und er hat Recht damit.

Seitdem moserst du hier rum, dass wir dir ans Bein
pinkeln wollen.

Werd erwachsen. Normalerweise schreibt man dann zur Antwort:
"Danke für die Klarstellung" und damit hat sichs.

Autor: Sven DerSchreckliche (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mag sein, daß cih noch älter werden muss, aber Ihr solltest lernen, 
genauer zu lesen

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aber Ihr solltest lernen, genauer zu lesen
Wer im Glashaus sitzt...

Tja, manche Leute lesen eben nur das, was sie lesen wollen. Der letzte 
Satz in meinem Posting sollte eigentlich betonen, dass das nicht als 
Angriff auf den Verfasser des vorhergehenden Postings gedacht war, 
sondern wirklich nur als ergänzende Anmerkung...

Autor: Stefan May (smay4finger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Kindereis für Sven
  ----
 (    )
  \----/
   \  /
    \/

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.