-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: volatile, const

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941

    volatile, const

    Anzeige

    hallo,
    "volatile" wird hier im forum immer falsch interpretiert.
    "volatile" ist das gegenteil von "const". in volatile können
    die variablen während des programmablaufes wechseln.
    man macht die variablen damit kennbar. auch wenn es fehlt,
    gibt es kein einfluss auf den programmablauf , es ist halt
    nur ein feiner programmstil.
    auch sagen einige, "sbi()" ist veraltet, ansichtssache sage ich.
    mfg pebisoft

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    03.01.2004
    Ort
    Pottenstein
    Alter
    38
    Beiträge
    265
    Moin moin!

    Das volatile ist nicht immer nur feiner Programmierstil, manchmal geht es nicht ohne. Zum Beispiel, wenn man Variablen sowohl im "normalen" Hauptprogramm als auch in Interruptroutinen verwenden will. Ohne Volatile haut das naemlich nicht hin, wie ich neulich wieder mal festgestellt hab...

    Und was soll man denn statt sbi() nehmen? Ich finde das ganz praktisch...

    Nils

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531
    Hallo Pebisoft,

    endlich mahl Jemand der etwas uber 'volatile' bescheid weiss.

    Vorbild:

    Code:
    main(){
      enable_timer0_overflow_interrupt;
      flag=1;
      while(flag){
      }
    }
    
    timer0_overflow_interrupt_handler{
      flag=0;
    }
    wenn flag wie 'unsigned char' definiert wird bleibt dass Program im 'while' Schleife hangen.

    wenn flag wie 'volatile unsigned char' definiert wird verlasst dass Program die 'while' Schleife sofort wenn ein timer0 interrupt geschied.

    Hier die compilierten listings.

    Code:
    Im Programlisting seht mann bei 'unsigned char'
    
    ldi r24,lo8(1)    //lade 0x01 in register 24
    sts flag,r24      //kopier register 24 in variabele 'flag'
    .L2               //label L2
    tst r24           //test register 24
    brne .L2          //so lange 'register 24' nicht null is gehe zuruck nach label .L2
    
    
    Im Programlisting seht mann bei 'VOLATILE unsigned char'
    
    ldi r24,lo8(1)
    sts flag,r24
    .L2
    lds,r24,flag     //hier wird immer aufsneu 'flag' in register 24 kopiert
    tst r24
    brne .L2
    Jetzt an hand diene Aufmerkung verstehe Ich volatile (Ich hatte Gestern zufallig mein 'flag' Problem als Frage im AVR-C Forum deponiert.

    Register r18, r19, r24 und r25 werden immer bei einem function-anruf auf dem Stack plaziert und nachher wieder zuruck geseztz.

    Thanks!

    Gruss

    Henk

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo und dieser feine programmierstil wurde hier in winavr aufgenommen,obwohl er von der commission noch nicht abgesegnet wurde. ich finde es aber trotzdem gut das er das programm jetzt beeinflusst. die programmierer von winavr halten dieses aber leider im dunkeln statt die info weiter zugeben. wenn ich das standard-c nehme hat es diese funktion, ist dort zugelassen und verändert aber nicht den code.
    mfg pebisoft

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, was winavr durcheinander bringt mit "volatile" ist , das die variable "volatile" dann mit einer "0" belegt wird und ohne "volatile" ist eine zufallszahl drin.
    mfg pebisoft

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.08.2004
    Ort
    Zwolle
    Alter
    61
    Beiträge
    531
    Hallo Pebisoft,

    Ich mochte es nochmal zusammenfassen um es fur michselbst gut zu verstehen.

    In assemblercode werden registers r24/r25 benutzt um variabelen werte zu testen.

    //hier wird 0x33 in r24 geladen und r24 nach myChar ram speicherplatz kopiert
    myChar=0x33;

    //Bei non-volatile wird angenommen das 0x33 sich noch immer in r24 bevindet und wird nur r24 abgefragt..
    if(myChar){} while(myChar){}

    //Bei volatile wird angenommen das 0x33 sich nicht mehr in r24 bevindet und wird zuerst speicherplatz myChar nach r24 kopiert und dann wird r24 abgefragt..
    if(myChar){} while(myChar){}

    'volatile' heisst 'fluchtig' dass heist die wert konnte sich inzwissen geanderd haben.

    Zuzammengefasst:
    non-volatile:
    - neuwert von variable x wird nicht getestet
    - anfangswert unbekannt
    volatile:
    - immer die neuwert von variabele x wird getestet
    - anfangswert immer 0

    Ich hab die anfangswert mit Asuro Robot ausgetestet und ist auch bei volatile und non-volatile immer 0 aber vielleicht macht das bootprogram eine ram initialisation.

    Gruss

    Henk

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2004
    Ort
    Karlsruhe
    Beiträge
    223
    auch sagen einige, "sbi()" ist veraltet, ansichtssache sage ich.
    wenn etwas als deprecated gekennzeichnet wird hat das einen immer Grund. Und die die den Compiler bauen wissen schon warum. Also was soll das dumme rumgetrolle hier? Sind wir jetzt schon im Heise-Forum oder was?

    @Minifriese:
    PORTC |= 1<<FOO;
    Hat den massiven Vorteil dass du auch mehr wie ein Bit gleichzeitig setzen kannst.

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    03.01.2004
    Ort
    Pottenstein
    Alter
    38
    Beiträge
    265
    Ist sbi() echt deprecated? War mir noch gar nicht aufgefallen. Naja, die Version mit dem Shiftoperator ist ja auch OK. Bei sbi() konnte man halt auf den ersten Blick sehen, was passiert. Die neue Version sieht etwas sperrig aus

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    34
    Beiträge
    237
    sbi() war halt ne spezielle funktion der avr-libc.
    Mit foo |= 1<<bar ist es halt ansi c und damit portabler.
    Und wie bluebrother schon gesagt hat, man kann mehrere bits
    setzen, daher ist es jetzt flexibler.


    Hab grad mal nachgesehen, in der aktullen Version (vom 15 Feb)
    scheint sbi() schon rausgeflogen zu sein.
    Open Minds. Open Sources. Open Future

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, die den compiler bauen ,wissen es nicht immer, dort gibt es auch einpaar "dussel". auch wie torsten festgestellt hat,das das sbi() nicht mehr drin ist. auch gibt es einige "programmierdussel" im "avr-forum".
    ich könnte diese sogar mit namen nennen, darf ich hier nicht.
    mfg pebisoft

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •