C-Code Optimiert!

Gast #892720
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
#892734
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.
Gast #892744
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

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