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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.