Forum: Compiler & IDEs fehlendes volatile in Drehgeber Artikel aus wiki?


von qqeettuu (Gast)


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 ;)

von Εrnst B. (ernst)


Lesenswert?

qqeettuu schrieb:
> da die Variable sowohl in der ISR als auch
> außerhalb verwendet wird?

wird sie nicht.

Einmal beim init beschrieben (da sind die Interrupts noch aus), später 
nur noch in der ISR.

von Peter II (Gast)


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.

von qqeettuu (Gast)


Lesenswert?

oh verdammt das stimmt. sry.

von Εrnst B. (ernst)


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.

von Peter II (Gast)


Lesenswert?

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

von Peter (Gast)


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?

von Εrnst B. (ernst)


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.

von Falk B. (falk)


Lesenswert?

Ist nicht auch das Ende der Funktion encode_init() eine memory barrier, 
wo alle Variablen definitiv zurückgeschrieben werden müssen?

von Peter II (Gast)


Lesenswert?

Falk Brunner schrieb:
> Ist nicht auch das Ende der Funktion encode_init() eine memory barrier,
> wo alle Variablen definitiv zurückgeschrieben werden müssen?

nein das nun nicht auch noch, da könnte er sie ja überhaupt nicht mehr 
inlinen.

von Oliver (Gast)


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

von Εrnst B. (ernst)


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.

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.