Forum: Compiler & IDEs avr-gcc: schreiben von 16-Bit Werten in 16-Bit Portregister


von Stefan May (Gast)


Lesenswert?

Hallo,

Ich frage mich gerade, ob ich mich auf ein Verhalten des gcc verlassen
darf. Wenn ich schreibe TCNT1=0x400, dann setzt der gcc das in
folgenden Assembler um

 25a:   3d bd           out     0x2d, r19       ; 45
 25c:   2c bd           out     0x2c, r18       ; 44

Ist es schlau, sich darauf zu verlassen, daß erst das High Register
beschrieben wird? Oder sollte man das aufteilen in

TCNT1H = 0x4;
TCNT1L = 0x0;

ciao, Stefan

von OldBug (Gast)


Lesenswert?

Da würd ich mich einfach mal drauf verlassen!

Aber aufpassen!
Das ist nicht Interrupt-Save!

von Fritz Ganter (Gast)


Lesenswert?

Aber die Lösung mit
TCNT1H = 0x4;
TCNT1L = 0x0;
verhält sich bei einem Interrupt auch nicht besser, als schreib ruhig

TCNT1=0x400

Das der Compiler das richtig macht ist in der Doku dokumentiert.

Du kannst natürlich vorher global die Interrupts abschalten und danach
wieder einschalten.

von Stefan May (Gast)


Lesenswert?

Das mit dem Interrupt war mir schon klar. Man darf sowieso von keinem
C-Statement ausgehen, daß es in einem Zyklus abgearbeitet wird. Solche
Sachen muß man dann mit Zugriffsmechanismen schützen. Stichwort:
Semaphore oder die ganz harte Methode, Interrupts abschalten.

Wenn das so dokumentiert ist, dann darf man sich darauf auch verlassen.


ciao, Stefan.

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.