fehlendes volatile in Drehgeber Artikel aus wiki?

Gast #2782928
Lesenswert?

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
Lesenswert?

Ε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 #2783045
Lesenswert?

>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
Lesenswert?

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
Lesenswert?

Ε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
Lesenswert?

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

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