Forum: Mikrocontroller und Digitale Elektronik Was ist schneller?


von Sebastian (Gast)


Lesenswert?

Hallo,

was ist schneller? Arbeiten mit "globalen Variablen", mit "Call by
Referenzen" oder mit richtigen Zeigern. Oder kann man das pauschal
nicht sagen.

Platform ein handelsüblicher ATmega16.

Merci für die Diskussion,
Sebastian

von Benedikt (Gast)


Lesenswert?

Globale Variablen sind meist schneller, da diese konstant sind und somit
nicht erst geladen werden müssen.

von Sebastian (Gast)


Lesenswert?

Würde ich auch behaupten. Wenn mal ein wenig Luft habe werde ich das mit
dem Simulator mal testen.

von Xenu (Gast)


Lesenswert?

Am besten ist es immer noch sich den Assemblercode anzuschauen.

von Charles (Gast)


Lesenswert?

Wenn die Variablen dauerhaft in Registern gehalten werden, geht's kaum
schneller.

z.B.:
.def  temp      = r17
.def  bit_counter    = r18

von Peter D. (peda)


Lesenswert?

"Globale Variablen sind meist schneller, da diese konstant sind und
somit nicht erst geladen werden müssen."


Das ist komplett falsch beim AVR, da der AVR keine Operationen direkt
im SRAM ausführen kann, sondern nur auf Registern.

Man sollte immer soviel wie möglich lokale Variablen verwenden.
Das ergibt schnellen und kurzen Code, da lokale Variablen meist in
Registern angelegt werden.


Beim 8051 ist das ähnlich, da einem bei vielen globalen Variablen
schnell der DATA-Bereich ausgeht und man dann die Variablen in XDATA
ablegen muß.


Peter

von Benedikt (Gast)


Lesenswert?

@Peter

Das ist schon klar, aber so wie ich das verstehe gehts hier um die
Übergabe von Daten von einer Funktion in C.

Und da sind globale Variablen nunmal am schnellsten, da der Compiler
diese zu
std Variable, Register
übersetzt
Pointer müssen erst in r30,31 kopiert werden usw.

von Unbekannter (Gast)


Lesenswert?

> was ist schneller?

Was soll die Raterei? Schreib ein kleines Testprogramm und miss es
einfach.

von Rolf Magnus (Gast)


Lesenswert?

Mich würde noch interessieren, was er unter "richtigen Zeigern"
versteht.

von Peter D. (peda)


Lesenswert?

@Benedikt,

auch Argumente werden in Registern übergeben, wenn es nicht sehr viele
sind. D.h. der Aufrufer muß sie nicht erst im SRAM ablegen und der
Aufgerufene wieder von dort holen.

Die Übergabe eines Funktionspointers in Registern kostet außerdem nur
ein einziges MOVW nach X,Y oder Z bei den Megas.

Der AVR-GCC kann auch Strukturen in Registern zurückgeben, wenn man
mehrere Rückgabewerte liefern will. Sieht erstaunlich effizient aus.
Ich nehme aber lieber Pointer, finde ich übersichtlicher.


Peter

von HAL9000 (Gast)


Lesenswert?

die ganze geschichte kommt wirklich auf compiler, situation und Baustein
an, beim 80C51 und SDCC war es zB so, dass diverse globale Variablen
Code-schonender (somit schneller) waren, während manchmal ne
Parameterübergabe schneller war.
Beim PIC controller mit CC5X compiler brauch man sich aber zB keine
sorgen machen, der compiler ist so mächtig, der rödelt das schon so
zurecht, wies am schnellsten / speicher sparendsten ist.

> Man sollte immer soviel wie möglich lokale Variablen verwenden.
bullshit, ausprobieren und n paar mal mehr auf F5 kloppen (oder wo auch
immer) ist immer das beste.

> Mich würde noch interessieren, was er unter "richtigen Zeigern"
versteht.
Zeiger = Pointer, wat sonst?
Meiner Meinung nach sind Pointer immer effizienter, da bin ich aber nu
absolut nicht sicher...

von Rolf Magnus (Gast)


Lesenswert?

>> Mich würde noch interessieren, was er unter "richtigen Zeigern"
>> versteht.
> Zeiger = Pointer, wat sonst?

Ach nee. Aber wenn es "richtige Zeiger" gibt, muß es auch was geben,
das irgendwie Zeiger ist, aber nicht so richtig.

von A.K. (Gast)


Lesenswert?

Bei GCC/AVR sollte man es vermeiden, die Adresse von lokalen Variablen
zu verwenden. Das zwingt den Compiler nämlich dazu, einen vollständigen
Stack-Frame aufzubauen, was recht aufwendig ist. Ausserdem muss er diese
Adresse aufwendig berechnen. Wenn man also die Adresse einer Variablen
verwendet, dann vorzugsweise von einer globalen oder statischen.

Besondern sinnvoll sind Pointer jedoch bei ARM, der sich mit
Pointer-relativer Adressierung weit leichter tut als mit absoluter.
Auch wenn ich das bislang nicht oft gesehen habe, ist es da auch
dienlich, die Bereiche der Steuerregister von I/O-Modulen jeweils zu
structs zusammenzufassen, statt jedes Register einzeln zu definieren.
Es erhöht die Chancen beträchtlich, dass der Compiler anfangs einmal
die Basisadresse des betreffenden I/O-Moduls läd und danach relativ
dazu adressiert, statt jedes einzelne Mal aufwendig die Adresse zu
laden. Wenn er dazu keine Lust haben sollte, man kann zudem mühelos per
expliziter relativer Adressierung nachhelfen.

Diese Deklarationstechnik erleichtert ausserdem generische Routinen,
beispielsweise wenn man den gleichen Code für mehrere gleichartige
UARTs benutzen will. Dies gilt hier auch für AVR oder MSP430, da auch
die ganz gut relativ adressieren können - 8051 und PIC tun sich damit
schwerer.

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.