Forum: Compiler & IDEs WinGCC und Pin-Toggle-Funktion


von Pepe (Gast)


Lesenswert?

Hallo.
Bin gerade dabei einen ASM-Code nach WinGCC zu portieren.
Der ATMega hat die Pin-Toggle-Funktion für Ausgänge.

Hab jetzt ein Verständnisproblem:

PINE = (1<<PINE3); Funktioniert

PINE |= (1<<PINE3); Funktioniert nicht

Wenn ich mir den Disassembler-Code ansehe, ist mir klar, dass
der Compiler bei

Variante 1: SBI PINE... übersetzt

und bei

Variante 2: LDS R24, PINE
            ORI R24, ...
            STS PINE, R24

draus macht. Ich sehe auch, dass die 2. Variante Probleme
macht. ( Weil ich ja alle gesetzen Pins toggle ).

Aber warum macht der Compiler bei Variant 2 das so bzw. gibt es
da noch mehr solche "Stelle", wo maneigentlich nur schreiben müsste,
der Compiler aber vorher liest.

Danke,
Pepe.

von Peter D. (peda)


Lesenswert?

Pepe schrieb:
> Aber warum macht der Compiler bei Variant 2 das so

Weil Du es so hingeschrieben hast.
Daß es Blödsinn ist, weiß der Compiler nicht und es interessiert ihn 
auch nichtmal.

Du sagst, mach ein OR und er macht es.



Peter

von Stefan E. (sternst)


Lesenswert?

Pepe schrieb:
> Variante 1: SBI PINE... übersetzt

Glaube ich nicht.

von Karl H. (kbuchegg)


Lesenswert?

Pepe schrieb:


> Variante 2: LDS R24, PINE
>             ORI R24, ...
>             STS PINE, R24
>
> draus macht. Ich sehe auch, dass die 2. Variante Probleme
> macht. ( Weil ich ja alle gesetzen Pins toggle ).
>
> Aber warum macht der Compiler bei Variant 2 das so

Du hast doch selbst schon rausgefunden, wo der Haken bei Variante 2 
liegt. Eben das alle Output-Pins, die momentan auf 1 sind, ebenfalls 
getoggelt werden. (Werden müssen ... denn genau das hast du ja 
hingeschrieben)
Aber: Woher soll denn der Compiler wissen, welche Pins momentan auf 1 
liegen? Und wenn du dir das mal genauer überlegst, was passieren muss, 
kommst du zum Schluss: er kann es gar nicht anders machen.

Dein SBI aus der Variante 1 geht nur deshalb, weil da genau nur 1 Pin zu 
toggeln ist. Aber diesen 'Luxus' gibt es in Variante 2 nicht.

von Matthias L. (Gast)


Lesenswert?

Und noch zur Info:
Das:
PINE = (1<<PINE3); Funktioniert
und das:
PINE |= (1<<PINE3); Funktioniert nicht

sind nicht dasselbe und haben auch nichts mit Toggeln zutun.

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.