WinGCC und Pin-Toggle-Funktion

Gast #2865804
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.
#2866016
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.

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