www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik volatile notwendig bei einer globalen var?


Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

ich verwende den xc164! muss man eine globale variable die man im 
interrupt und in der main loop verwendet oder über mehrere interrupts 
verwendet mit volatile deklarieren?

also.:
unsigned char volatile g_test=0;

void ASC0_viRx(void) interrupt 0x2B
{
    g_test = 1;
}

void main
{
   while(test == 0);
   ...
}

lg

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt auf deinen Compiler an, und ob er "sieht" das du deine Variable im 
Int änderst.

Setze sie einfach Volatile, da gehst du vielen Problemen aus dem Weg.

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ich ändere die globale var im interrupt! ohne volatile speichert er 
mir die variable in einem register zwischen...kommt halt auf die 
compiler optimierung an...

verwende den Keil C166 compiler!

reicht das volatile für die synchronisierung? ich muss ja nur dafür 
sorgen, dass er die variable in einem asm befehl gelesen oder 
geschreiben wird?!

nimmt man hier variante a oder b?
a.) unsigned char volatile g_test=0;
    anderes modul:
    extern unsigned char volatile g_test;

b.) volatile unsigned char g_test=0;
    anderes modul:
    extern volatile unsigned char g_test;


lg

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm?

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerald schrieb:
> reicht das volatile für die synchronisierung? ich muss ja nur dafür
> sorgen, dass er die variable in einem asm befehl gelesen oder
> geschreiben wird?!

volatile synchronisiert nicht. Und es sorgt auch nicht für atomare 
Zugriffe.

volatile macht überhaupt viel weniger, als die Leute gemeinhin so 
annehmen.

Autor: memory barrier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerald schrieb:
> reicht das volatile für die synchronisierung?

Dafür reicht volatile nie, und dafür ist es auch nicht da.
Synchronisierung, Thread/Interrupt-Sicherheit, Atomare Zugriffe usw. 
kannst du mit volatile nicht erzwingen.
=> Selber machen (cli/sei) oder wissen, das ein 8-Bit-µC eine 
8-Bit-Variable sowieso in einem Befehl lesen wird.

Und auch für deinen eigentlichen Anwendungszweck ist volatile nicht 
wirklich richtig, funktioniert aber und ist halt C-Anfängern leichter 
beizubringen als die Alternativen.

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.