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
Huch ich glaube da hast du dich im Forum vertan(wie schreibt man das ?!) ^^ Könnte das bitte jmd verschieben danke. Gruß Sebastian
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.