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


von Gerald (Gast)


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

von Rene K. (draconix)


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.

von Gerald (Gast)


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

von Gerald (Gast)


Lesenswert?

hmmm?

von Mario (Gast)


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.

von memory barrier (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.