Was ist die schnellere Operation?

Gast #1965882
Lesenswert?

Hallo,

ich hätte da mal eine Frage zur Abarbeitung einiger Befehle.

Bits setzen per define:

#define setzen1 11001100
#define setzen2 11001011

reg1 = setzen1;
[Something to do]
reg1= setzen2;
[Something to do]
reg1 = setzen1;

bits setzen durch log. Ops:

reg1= 11001100;
[something to do]
reg1 &= ~(1<< 2);
reg1 |=11;
[something to do]
reg1 &= ~((1<<1)|(1<<0));
reg1 |= (1<<2);

oder (falls das überhaupt geht):

reg1= 11001100;
[something to do]
reg1^=((1<<2) | (1<<1) | (1<<0));

Meine Frage nun, sofern die Operationen funktionieren, welche davon 
verwendet man am Häufigsten bzw. welche ist die schnellste?
Und: Bitte um Korrektur, wenn ich Operationen falsch umgesetzt habe.

Vielen Dank für eure Hilfe.

gruß
Herbie
Gast #1965892
Lesenswert?

Oh, entschuldigung.

Ich meinte, welche Operation ist auf einem Mikrocontroller der 
ATMega-Serie (AVR) am Schnellsten durchzuführen?
Z.B. als Interrupt-Operation. Da sollen die Befehle ja möglichst schnell 
abgearbeitet werden.
In dem Register sollen halt nur ein paar Bits umgeschrieben werden.

Danke für den Hinweis.
#1965901
Lesenswert?

Ich verstehe ehrlich gesagt die Frage nicht so richtig.
Die beiden Teile sind nicht äquivalent, sie machen unterschiedliche 
Dinge.
Die 3 Zuweisungen sind bestimmt nicht so zeitkritisch, daß Du hier über 
eine Optimierung nachdenken müsstest.
Interessant ist da eher der Teil [something to to]
Gast #1965903
Lesenswert?

Udo Schmitt schrieb:
> Die beiden Teile sind nicht äquivalent, sie machen unterschiedliche
> Dinge.

Die 3 Teile sollten eigentlich alle das Gleiche machen.

Herbie schrieb:
> reg1= 11001100;
> [something to do]
> reg1^=((1<<2) | (1<<1) | (1<<0));

Da habe ich noch vergessen:

 [something to do]
reg1^=((1<<2) | (1<<1) | (1<<0));

(denke ich).

Wo ist denn der Fehler, wenn die nicht alle das Gleiche machen?
Moderator (Firma: Titel) Persönliche Seite #1965925
Lesenswert?

Herbie schrieb:
> Meine Frage nun, sofern die Operationen funktionieren, welche davon
> verwendet man am Häufigsten bzw. welche ist die schnellste?
Ich würde die Variante 1 nehmen, denn dann könnte ich einfach durch ein 
Ändern des #defines definierte andere Werte auf das reg1 schreiben.
Bei den anderen beiden Versionen ist das wesentlich versteckter...
Gast #1965930
Lesenswert?

Das Setzen des Register reg1 soll am Ende immer gleich sein.

Also zwischen den [something to do]-Abschnitten.
Das erste Mal soll 11001100 in reg1 stehen. Dann kommt [something to 
do], danach soll 11001011 in reg1 stehen. Dann wieder [something to do] 
und danach soll wieder 11001100
 in reg1 stehen.

Udo Schmitt schrieb:
> Kann jetzt aber auch nicht mehr weiter reinschauen, muss arbeiten,
> sorry.

Ok, danke für deine Hilfe. Viel Spaß beim Arbeiten.
Gast #1965932
Lesenswert?

Lothar Miller schrieb:
> Ich würde die Variante 1 nehmen, denn dann könnte ich einfach durch ein
> Ändern des #defines definierte andere Werte auf das reg1 schreiben.
> Bei den anderen beiden Versionen ist das wesentlich versteckter...

Danke sehr. Die andern beiden Versionen wären halt variabel; aber 
defines sind übersichtlicher.
Wäre denn die 1. Variante auch am Schnellsten oder tun die sich da alle 
nicht viel?
Gast #1965953
Lesenswert?

ein blick in die assembler-doku hilft weiter bezgl der 
ausführungszeiten.
da ein c-compiler mit unterschiedlichen optimierungs-varianten arbeiten 
kann, ist auch der generierte assembler-code unterschiedlich.

generell schlägt eine logische operation mit einem takt zu buche, 
genauso eine zuweisung. zusätzlich können noch stack-operationen 
dazukommen, da man in c nicht so viel kontrolle über die einzelnen 
register hat wie in assembler
#1965964
Lesenswert?

> reg1 &= ~((1<<1)|(1<<0));
> reg1 ^= ((1<<2) | (1<<1) | (1<<0));

In beiden Varianten läuft das bei reg1 = I/O-Register auf laden, 
modifizieren, speichern als 3 getrennte Operationen raus.

> reg1 |= (1<<2);

Wenn reg1 im bitadressierbaren Bereich der I/O-Ports liegt, dann ist das 
ein einziger Befehl, somit effizienter. Wenn nicht, dann lauft das genau 
wie oben.
Gast #1965968
Lesenswert?

A. K. schrieb:
> In beiden Varianten läuft das auf laden, modifizieren, speichern als 3
> getrennte Operationen raus.

das muss aber nicht sein, die variable kann ja schon in einem Register 
stehen. Bzw. sie kann eine Lokale Variable sein und nur in einem 
Register vorhanden sein.

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