sbi und cbi in C

Gast #2899470
Lesenswert?

Hallo,

hab grad festgestellt, dass gcc-avr Sequenzen wie
1
PORTB |= (1<<PORTB3)
je nach Laune als
1
sbi PORTB,PORTB3
oder als (sinngemäß)
1
in r16,PORTB
2
ori r16,PORTB3
3
out PORTB,r16
übersetzt.

Wie kann ich ihn "zwingen", die erste Form zu verwenden?

Im C-Tutorial steht:
"In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc 
entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und 
cbi gesetzt bzw. gelöscht. Beide Funktionen sind in aktuellen Versionen 
der avr-libc nicht mehr enthalten und auch nicht mehr erforderlich."

Dieses "nicht mehr erforderlich" wundert mich grad, weil ich genau diese 
Funktionen brauche und keine Alternative kenne. Der betreffende Port 
wird nämlich auch aus einer Interrupt-Routine heraus genutzt, ich kann 
mit hier keine Zugriffsüberschneidungen erlauben.

Habt ihr eine Idee?
Gast #2899476
Lesenswert?

C-Bastler schrieb:
> Wie kann ich ihn "zwingen", die erste Form zu verwenden?
Garnicht.
Die Variante mit 'or' verwendet er gerne, wenn mehrere Bits zugleich 
bearbeitet werden.


> Der betreffende Port
> wird nämlich auch aus einer Interrupt-Routine heraus genutzt, ich kann
> mit hier keine Zugriffsüberschneidungen erlauben.
In einer Interrupt-Routine wird dir auf dem AVR normalerweise auch 
niemand mehr dazwischenfunken. Oder verschachtelst du die Interrupts?


> Habt ihr eine Idee?
Notfalls Inline-Assembler nehmen.
Gast #2899519
Lesenswert?

Hallo & danke für die schnellen Antworten!

Sven P. schrieb:
> Die Variante mit 'or' verwendet er gerne, wenn mehrere Bits zugleich
> bearbeitet werden.

Richtig, ist mir auch aufgefallen.

> In einer Interrupt-Routine wird dir auf dem AVR normalerweise auch
> niemand mehr dazwischenfunken. Oder verschachtelst du die Interrupts?

Missverständnis. Es geht um Hauptprogramm und Interrupt-Routine. Beide 
verwenden unterschiedliche I/O-Pins, diese sind aber auf dem gleichen 
Port (8-Pin-ATtiny).

> Notfalls Inline-Assembler nehmen.

Wär eine Idee, hab ich nur noch nie gemacht... Ich kenne nur den 
"normalen" Assembler. Wie schreib ich das dann? - So?
1
asm volatile ("sbi PORTB,PORTB3");

"PORTB" hab ich als Makro (per #define). - Dann also so?
1
asm volatile ("sbi "LEDPORT","LEDPIN);
#2899546
Lesenswert?

C-Bastler schrieb:
> Sven P. schrieb:
>> Die Variante mit 'or' verwendet er gerne, wenn mehrere Bits zugleich
>> bearbeitet werden.
>
> Richtig, ist mir auch aufgefallen.

Wie sollte er es da auch anders machen? Mehrere sbi hintereinander wären 
ja schließlich was grundlegend anderes, als im C-Code geschrieben wurde.
(Port-Pins gleichzeitig schalten <-> Port-Pins nacheinander schalten).

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