mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was ist schneller?


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am besten ist es immer noch sich den Assemblercode anzuschauen.

Autor: Charles (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Variablen dauerhaft in Registern gehalten werden, geht's kaum
schneller.

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> was ist schneller?

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mich würde noch interessieren, was er unter "richtigen Zeigern"
versteht.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HAL9000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.