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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.