www.mikrocontroller.net

Forum: Compiler & IDEs avr-gcc Optimierung und volatile


Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich habe da mal eine Frage zu den "Registerdeklarationen":
Ist es nicht so, daß alle Register per deklaration für den Compiler
flüchtig (volatile) sind? Würde diese Voraussetzung das "asm volatile
("nop"::);" in einer warte-while-schleife (was'n Wort :) obsolet
machen?

>#include <inttypes.h>
>#include <avr/interrupt.h>
>
>void my_eeprom_write_byte(uint16_t *addr, uint8_t val)
>{
>  cli(); /* disable all ints */
>  /* Wait for completion of previous write */
>  while(EECR & (1<<EEWE)) asm volatile ("nop"::);
>  /* Set up address and Data Registers */
>  EEAR = *addr;
>  EEDR = val;
>  /* Write logical one to EEMWE */
>  EECR |= (1<<EEMWE);
>  /* Start eeprom write by setting EEWE */
>  EECR |= (1<<EEWE);
>        /* Wait for completion of this write */
>  while(EECR & (1<<EEWE)) asm volatile ("nop"::);
>  sei(); /* re-enable all ints */
>}

Aus nem anderen Thread kopiert, weil mir das bei dem Beispiel wieder
eingefallen ist - neue Frage, neuer Thread ;)

Gruß,
Patrick...

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, volatile hat mit Registern nichts zu tun -- im Gegenteil, es
handelt sich dabei prinzipiell um Speicheradressen.

volatile in inline asm ist ohnehin noch was Anderes (da inline asm ja
non-standard ist): es bedeutet, daß der Compiler die
Assembleranweisung nicht nach eigenem Gutdünken verschieben darf.

Aber wie Martin ja schon schrieb, diese nops kosten ohnehin nur ein
überflüssiges Befehlswort und sind sonst an der Stelle zu nichts
nütze.  Das Warten auf den entsprechenden Bitwert funktioniert auch
ohne diese, weil das beteiligte IO-Register (das intern ja erstmal
eine Speicheradresse ist) als volatile markiert ist und damit jedesmal
neu bewertet wird.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>...weil das beteiligte IO-Register (das intern ja erstmal
>eine Speicheradresse ist) als volatile markiert ist und damit
jedesmal
>neu bewertet wird.

Danke Jörg, genau das meinte ich...
Hab mich nur gewundert, daß so viele Leute dieses inline-asm verwenden.
Ich wusste vom msp430-gcc, daß dort die Register volatile markiert
sind,  daher meine Frage.

Gruß,
Patrick...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.