mikrocontroller.net

Forum: Compiler & IDEs C-Code Optimiert!


Autor: tc11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin zusammen,

Ich habe mal eine generelle Frage zu einem C-Code. Folgendes ich hab 
eigentlich immer gedacht das wenn ich meinen µC programmiere das ich 
Zeit Spare wenn ich Funktionen Nutze.

Ich habe mir mal den Speicherplatz verbrauch bei einem Mini-Programm 
angeschaut so wie das hier
[c]
Main(void)
{
   _delay_ms(100);
}
[/c)

bei diesem code wird ein bestimmter platz gebraucht.
Wenn man nun folgendes schreibt
[c]
Main(void)
{
   _delay_ms(100);
   _delay_ms(100);
   _delay_ms(100);
}
[/c)

Dann wird 3mal soviel Speichplatz gebraucht so als wenn du Funktion 
einfach nur den Text aus der jeweiligen datei kopiert und dort einfügt.

Ist das echt so gewollt?

Ich hatte eigentlich vermutet das wenn man eine funktion benutzt das 
diese dann EINMALIG im Speicher abgelegt wird und das dann immer nur 
dort hingesprungen wird.

Hab ich da einfach nur was falsch verstanden ?

Gruß
Tee Cee

Autor: Sebastian B. (sebastian86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huch ich glaube da hast du dich im Forum vertan(wie schreibt man das ?!) 
^^

Könnte das bitte jmd verschieben danke.


Gruß

Sebastian

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tc11 wrote:

> Folgendes ich hab
> eigentlich immer gedacht das wenn ich meinen µC programmiere das ich
> Zeit Spare wenn ich Funktionen Nutze.

Nein, du sparst Platz, keine Zeit (im Sinne von "Ausführungszeit").

> Dann wird 3mal soviel Speichplatz gebraucht so als wenn du Funktion
> einfach nur den Text aus der jeweiligen datei kopiert und dort einfügt.
>
> Ist das echt so gewollt?

Ja, denn _delay_ms ist eine Inline-Funktion.

> Ich hatte eigentlich vermutet das wenn man eine funktion benutzt das
> diese dann EINMALIG im Speicher abgelegt wird und das dann immer nur
> dort hingesprungen wird.

Bei "normalen" Funktionen ist das auch so.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Delay-Funktionen sind aus folgenden Gründen inline:

- Nur wenn die Funktionen inline sind, kann der Compiler die ziemlich
  aufwendige Umrechnung von Millisekunden in Schleifendurchläufe
  während des Kompilierens durchführen. Sonst müsste das zur Laufzeit
  passieren, was Zeit kostet und die Funktion sehr stark aufblähen
  würde.

- Die Funktionen sind kurz (3 Worte mit dem Laden des Argument-
  registers). Ein Aufruf als Unterprogramm braucht 2 bis 3 Worte (je
  nachdem, ob RCALL ausreicht oder CALL benutzt werden muss). Man
  würde also also nur 0 bis 1 Worte pro Aufruf einsparen.

- So wie die Funktionenen implementiert sind, ensteht keinerlei
  Aufruf-Overhead, nicht einmal durch das Laden des Argumentregisters,
  da der dafür benötigte Prozessorzyklus beim Verlassen der Schleife
  durch den dann nicht verzweigenden BRNE-Befehl kompensiert wird.
  Als Unterprogramm kommen durch die CALL-/RCALL- und RET-Befehle 7
  bis 10 Zyklen Overhead dazu, was bei einer Zeitauflösung von 3
  (_delay_us) bzw. 4 (_delay_ms) Zyklen schon etwas stört.

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.