fehlendes volatile in Drehgeber Artikel aus wiki?

Gast #2782928
Hallo,
ich hab mir http://www.mikrocontroller.net/articles/Drehgeber angesehen. 
Mir ist nun folgende stelle aufgefallen:
1
static int8_t last;
fehlt da nicht ein volatile, da die Variable sowohl in der ISR als auch 
außerhalb verwendet wird?

Ich muss allerdings sagen, dass meine C Kenntnisse nicht all zu toll 
sind ;)
Gast #2782941
Εrnst B✶ schrieb:
> wird sie nicht.
>
> Einmal beim init beschrieben (da sind die Interrupts noch aus), später
> nur noch in der ISR.

doch er hat recht, es kann durchaus passieren das die initalisierung nie 
im speicher landet. Aber das spielt vermutlich keine rolle und wird auch 
so laufen.
Gast #2783041
Εrnst B✶ schrieb:
> IIRC ist das sei() eine memory barrier, d.H. der Optimizer muss den
> initialisierten Wert vor dem sei() an die Ziel-Speicherstelle schreiben.

nein ist es nicht. sei ist nur ein ASM befehl - dem compiler ist es 
ziemlich egal.
Gast #2783045
>Peter II schrieb:
>> doch er hat recht, es kann durchaus passieren das die initalisierung nie
>> im speicher landet.
>
>IIRC ist das sei() eine memory barrier, d.H. der Optimizer muss den
>initialisierten Wert vor dem sei() an die Ziel-Speicherstelle schreiben.

Sowas höhre bzw. lese ich zum erstenmal! Informationsqelle?
#2783047
Hmm, meine avr-libc enthält
1
# define sei()  __asm__ __volatile__ ("sei" ::: "memory")

und das ist deutlich mehr als nur der asm-Befehl.

Das sagt die Dokumentation dazu:
1
    Enables interrupts by setting the global interrupt mask. This function
2
    actually compiles into a single line of assembly, so there is no function
3
    call overhead.  However, the macro also implies a memory barrier
4
    which can cause additional loss of optimization.
Gast #2783116
Εrnst B✶ schrieb:
> Peter II schrieb:
>
>> doch er hat recht, es kann durchaus passieren das die initalisierung nie
>> im speicher landet.
>
> IIRC ist das sei() eine memory barrier, d.H. der Optimizer muss den
>
> initialisierten Wert vor dem sei() an die Ziel-Speicherstelle schreiben.

IIRC hindert eine Memory-Barrier den Compiler in keinster Weise daran, 
Variablen ganz wegzuoptimieren, wenn der der Meinung ist, daß die 
niemand braucht. Und genau das könnt hier passieren. Dagegen hilft nur 
volatile.

Oliver
#2783133
Oliver schrieb:
> Variablen ganz wegzuoptimieren, wenn der der Meinung ist, daß die
> niemand braucht

Komplett weglassen kann er last nicht: es wird ja verwendet.

Er könnte es aber in ein Register legen, und die Speicherstelle 
einsparen.

Das würde in diesem Fall auch überhaupt nicht stören.

Allenfalls wenn der Compiler auf die Idee kommen würde, für ein Register 
eine zweite Kopie in einem anderen Register anzulegen, dann würde die 
memory barrier alleine nicht mehr reichen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.