Forum: Compiler & IDEs avr-gcc Optimierung und volatile


von OldBug (Gast)


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...

von Jörg Wunsch (Gast)


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.

von OldBug (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.