mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kleines Makro, inline asm so richtig?


Autor: Micha s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

bin grad ein wenig am Code optimieren.
Prozessor ist ein ATTiny

ich hab ein kleines Makro zum Bit setzen/rücksetzen in C geschrieben:
#define SETBIT(BYTE,BIT)     ((BYTE) |=  (1<<(BIT)))

und ihr wisst ja selber was der compiler daraus macht...
jetzt wollte ich das ganze in ein inline asm packen, in etwa so:
#define setbit(BYTE, BIT)     asm("SBI  (BYTE), (BIT)") // SBI P,b
ist das so möglich bei inline assembling einzubinden??

grüße und schon mal danke im voraus :))

Autor: ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> #define setbit(BYTE, BIT)     asm("SBI  (BYTE), (BIT)") // SBI P,b

Unter der Voraussetzung, das dein "P" ein I/O-Register ist, dann ist das 
auch die effektivste Methode, dort ein Bit einzuschalten.
Spricht in meinen Augen für den Compiler.
mfG ingo

Autor: Micha s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so stehts mal im instruction set :))

SBI P,b Set Bit in I/O Register I/O(P,b) ← 1

Autor: greg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha s. schrieb:
> und ihr wisst ja selber was der compiler daraus macht...

Ja, ein SBI - normalerweise. Hast du die Optimierung ausgeschaltet? Oder 
wofür soll das Makro sonst gut sein?

Autor: Micha s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne optimierung ist auf default 0s

((BYTE) |=  (1<<(BIT)) daraus macht er mit sicherheit kein sbi...

er setzt ne odermaske über ein geshiftetes bit, also minimum 2 befehle 
macht er daraus!

Autor: greg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also bei mir nicht, da macht der Compiler sehr zuverlässig SBI/CBI, wenn 
das Code einspart und möglich ist.

Z.B.
#include <avr/io.h>

int main(void) {
    PORTA |= 1<<4;

    for(;;);
}

Kompiliert mit
avr-gcc -mmcu=attiny2313 -Wall -Os -S -c foo.c

Dann sieht das so aus in foo.s:
main:
/* prologue: function */
/* frame size = 0 */
        sbi 59-32,4
.L2:
        rjmp .L2

Autor: greg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anmerkung: in der avr-libc gab es auch mal Makros sbi() und cbi(). Die 
sind aber schon seit langer Zeit deprecated und wurden dann entfernt, 
gerade eben da der Compiler schlau genug ist.

Autor: Micha S. (e-tec)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay werd es mir bei gelegenheit nochmal heute nachmittag anschauen :)
prinzipiell war das eig auch mehr die frage ob ich das in asm richtig 
übersetzt habe, nicht die frage nach bit setzen/löschen... :)

grüße

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha s. schrieb:

> ich hab ein kleines Makro zum Bit setzen/rücksetzen in C geschrieben:
>
> #define SETBIT(BYTE,BIT)     ((BYTE) |=  (1<<(BIT)))
> 
>
> und ihr wisst ja selber was der compiler daraus macht...

Ja.
Er macht ein sbi oder cbi draus, je nachdem ob Setzen oder Löschen 
angesagt ist.
Und das Schönste am Ganzen: Der Compiler weiß auch, wann das nicht geht 
und benutzt dann sts bzw lds wenn er das I/O Register anders nicht 
erreichen kann.

Wozu also inline Assembler?

Autor: Micha S. (e-tec)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie gesagt, ich werde es mir heute nochmal anschauen :)
und prinzipiell ging es um den asm code, NICHT um setzen oder löschen 
der bits :))

wie kann man eigentlich mehrere asm befehle in asm("...") packen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.