volatile for dummies



  • Hallo
    Ich verstehe das mit volatile nicht so richtig.

    volatile = flüchtig

    Ich habe eine function mit Rückgabewert 0x23, die blöde
    funtion hat mir aber immer 0x0b geliefert.

    nichts besonderes PIC32 Code

    uint8_t toTXfifo(uint8_t reg, uint8_t* source, uint8_t count)
    {
    	Nop();
        while(count--)
    		highWrite(reg++,*source++);
        Nop();
    	return (reg);
    }
    

    Aufgerufen wird das ganze mit

    wReg = toTXfifo(wReg,Tx.payload,Tx.payloadLength);

    wReg war mit

    uint8_t wReg;

    definiert

    habe es so geändert

    uint8_t volatile wReg;

    und der Rückgabewert ist richtig.

    Der folgende Artikel ist recht gut,
    seit mir nicht böse aber es sackt nicht,
    es geht nicht in meinen Kopf.
    Ich verstehe was ich da lese aber für einen Delphianer.....
    Ich möchte nur verstehen, wann es notwendig ist volatile
    zu benutzen

    http://www.barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword


  • Mod

    Bei volatile geht es darum, dass der damit gekennzeichnete Speicherbereich auch von außerhalb der Anwendung geändert werden darf, also keine Optimierungen darauf durchgeführt werden dürfen, die davon ausgehen, dass die dort gespeicherten Werte unverändert bleiben. Ein typisches Beispiel dafür wäre memory-mapped I/O. Der Rückgabewert deiner Funktion ist höchstwahrscheinlich kein Beispiel für die richtige Benutzung von volatile und du bist völlig auf dem Holzweg.



  • ats3788 schrieb:

    volatile = flüchtig

    Nein, das bedeutet in diesem Fall unberechenbar
    In dem Sinne, dass der Compiler nicht die Kontrolle über die Variable hat, da sie von anderer Stelle jederzeit verändert werden kann.

    Das kann von einem Interrupt kommen oder von irgendwelcher Hardware.

    Normalerweise geht der Compiler davon aus, dass der Wert, der zuletzt in eine Variable geschrieben wurde, da auch wieder raus gelesen wird. Bei volatile ist dies nicht so



  • volatile heißt, daß der Wert zur Laufzeit neu evaluiert werden muss, auch, wenn er vorher mal genommen wurde und noch in irgendeinem Register rumhängt, was sich ja meist schneller auslesen läßt. Das darf der Compiler dann auch nicht wegoptimieren.



  • Danke für eure Antwort. 👍
    Ich habe das nochmal im
    Compiler Handbuch nachgelesen. Als Delphianer
    kann ich das so richtig, nicht nachvollziehen.

    Was nur blöd ist das der Compiler etwas weg Optimiert, was
    für die Funktion wichtig ist, oder besser im Live Code funktioniert
    alles richtig, aber nicht beim Debuggen, ist wohl
    Microchip XC32 Spezifisch.



  • Was nur blöd ist das der Compiler etwas weg Optimiert, was
    für die Funktion wichtig ist

    im Normafall hat der Kompiler ja 100% Kontrolle über die Variablen usw. und kann durch Optimierung z.B. (sehr) viel Geschwindigkeit rauskitzeln

    würde man jetzt wegen so einer Besonderheit wie mit deinem Register (nicht unter Kontrolle des Kompilers) einfach mal alles als nicht optimierbar ansehen wären alle unseren Programme deutlich langsamer

    darum hat man das Zauberwort volatile eingeführt um solche Spezialitäten dem Kompiler zu vermitteln - und unter Delphi/Pascal/... ist das auch nicht anders

    was es gibt sind spezielle Kompiler die andere Schlüsselwörter haben um sowas auszudrücken - da musst du dann deine Variable als REGISTER markieren oder sowas - was aber im Endeffekt das gleiche wie volatile ist

    Schlussendlich gibt es einfach Bereiche in der Softwareentwicklung wo man mit Trial & Error nicht wirklich gut vorankommt - gilt z.B. aber auch für Multi-Threading und solche Geschichten


  • Mod

    ats3788 schrieb:

    Was nur blöd ist das der Compiler etwas weg Optimiert, was
    für die Funktion wichtig ist, oder besser im Live Code funktioniert
    alles richtig, aber nicht beim Debuggen, ist wohl
    Microchip XC32 Spezifisch.

    Das klingt eher nach einem Programmierfehler. Auf undefiniertes Verhalten verlassen. volatile hat damit nichts zu tun. Mag vielleicht das Symptom zufälligerweise beheben, aber falsch bleibt falsch.


Log in to reply