Ok, der Thread ist schon etwas älter, aber da das Thema volatile gerade bei mir aktuell ist, schreibe ich hier mal das, was ich dazu gelernt habe:
volatile sagt dem Compiler, dass der Wert einer Variable sich jederzeit ändern kann, ohne dass das in der aktuellen Funktion ersichtlich ist. Daher sind zum Beispiel Hardwareregister bei PICs als volatile deklariert. Denn die können sich ja jederzeit ändern, ohne dass die Software diese angefasst hat. Oder wenn man eine globale Variable in einem Interrupt ändert, kann das für die laufende Funktion unbemerkt bleiben.
Hier ein Beispiel:
Der C-Compiler würde ohne volatile denken, dass vol_var in der Schleife unverändert bleibt, deswegen den Wert von vol_var nur einmal ermitteln und dann in der Schleife den einmal ermittelten Wert immer wieder verwenden. Mit volatile hingegen wird er vor jeder Benutzung den Wert holen und so immer aktuell wie möglich sein.Code:volatile int vol_var; while (bedingung) { int a=vol_var; // Zeile A printf("%d\n",vol_var); // Zeile B }
Auf den Code des ersten Posts
bezogen bedeutet das:Code:static volatile unsigned short tmrGATEcounter; void ReadEEdata8(unsigned char *dest, unsigned char addr){...} void InitVars (void) { ReadEEdata16 (tmrGATEcounter, 2); //Time aus EEPROM laden. }
Die Variable tmrGATEcounter ist volatile, unsigned char *dest nicht. Der Compiler würde so (auch bei einem Zeiger) die Information verlieren, dass *dest eine volatile Variable ist.
Sinnvoll wäre also:
Da tmrGATEcounter ja zugewiesen werden soll, reicht es, wenn man einen Zeiger auf eine nicht-volatile Variable übergibt, und dann danach die Zuweisung mit dieser durchführt.Code:void InitVars (void) { unsigned short temp; ReadEEdata16 ((unsigned char*)&temp, 2); //Time aus EEPROM laden. tmrGATEcounter = temp; }
(Ich hab jetzt mal den Unterschied zw. unsigned char und unsigned short ignoriert.)







Zitieren

Lesezeichen