avr-gcc Optimierung und volatile

Gast #100195
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...
Gast #100196
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.
Gast #100197
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren