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


von Micha s. (Gast)


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:
1
#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:
1
#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 :))

von ingo (Gast)


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

von Micha s. (Gast)


Lesenswert?

so stehts mal im instruction set :))

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

von greg (Gast)


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?

von Micha s. (Gast)


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!

von greg (Gast)


Lesenswert?

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

Z.B.
1
#include <avr/io.h>
2
3
int main(void) {
4
    PORTA |= 1<<4;
5
6
    for(;;);
7
}

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

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

von greg (Gast)


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.

von Micha S. (e-tec)


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

von Karl H. (kbuchegg)


Lesenswert?

Micha s. schrieb:

> ich hab ein kleines Makro zum Bit setzen/rücksetzen in C geschrieben:
>
1
> #define SETBIT(BYTE,BIT)     ((BYTE) |=  (1<<(BIT)))
2
>
>
> 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?

von Micha S. (e-tec)


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?

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.