Gast
#181282
Hallo,
ich habe da ein Problem mit dem GCC Compiler im Zusammenhang
mit Volatile-deklarierten Variablen und Code-Optimierung.
Interesant ist die Zeile: 'while(cinw_ptr == cinr_ptr);' in der
Funktion 'ReadComDaten'. Während dieser While-Schleife wird auf
das Eintreffen eines neuen Bytes vom COM-Port gewartet. Dieses
wird per Interruptroutine empfangen und in einen Empfangspuffer
eingetragen. Dabei wird der Zeiger 'cinr_ptr' um 1 erhöht, woran
man dann erkennen kann das ein neues Byte angekommen ist.
Das Problem ist, das die Variablen 'cinw_ptr' und 'cinr_ptr'
zwar global als Volatile deklariert sind, der Compiler es aber so
übersetzt
das die Variablen in Register geladen werden und dann nur noch mit
diesen
gearbeitet wird und nicht mehr mit den eigentlichen Variablen. (siehe
unten)
Ich dachte eigentlich das mit 'Volatile'-Variablen genau das
verhindert werden
soll.
Vielleicht hat jemand eine Idee, was da schief läuft.
MfG
Bernd
C-Code:
volatile uchar *cinw_ptr, *cinr_ptr, *coutw_ptr, *coutr_ptr;
uchar ReadComData(void)
{
uchar data;
while(cinw_ptr == cinr_ptr); // warten auf ein neues Byte ...
data = *cinr_ptr;
cinr_ptr++;
.... weiterer Code .....
}
Daraus macht der Compiler, mit Optimierung -Os:
uchar ReadComData(void) // (warte und) lese
Zeichen vom Com-Port
{
2ba: 80 91 62 00 lds r24, 0x0062
2be: 90 91 63 00 lds r25, 0x0063
2c2: e0 91 60 00 lds r30, 0x0060
2c6: f0 91 61 00 lds r31, 0x0061
uchar data;
while(cinw_ptr == cinr_ptr);
// warte auf Zeichen
2ca: 8e 17 cp r24, r30
2cc: 9f 07 cpc r25, r31
2ce: e9 f3 breq .-6 ; 0x2ca
weiterer Code ....