Hallo zusammen, Ich habe eine allgemeine Frage zu der Atmel-Programmierung und zwar wenn ich ein Programm schreibe und Methoden in Modulen(C Programmierung) schreibe, diese dann aus meiner Main-Methode heraus aufrufe, habe ich dann einen Zeitverlust? Bzw. ist der Programmcode schneller ausgeführt, wenn ich den Code direkt in der Main Methode einfüge?
Hallo Sven, wenn Du die Funktionen aus der Main aufrufst, kostet das die Zeit für einen Call (auf Assembler-Ebene) incl. den notwendigen Sachen für den Kontext-Wechsel plus das entsprechend für den "Rücksprung" in die Main. Das sind aber nur ein paar Mikrosekunden. Wenn Du den gesamten Code in die Main packst, sparst Du dir diesen (sehr geringen) Zusatzaufwand an Zeit zu lasten schlechter lesbarem Code. Fazit: Normalerweise ist Modularisierung besser weil übersichtlicher. Grüße Hoschti
Wären das nicht ein paar Nanosekunden bei einer taktfrequenz von 8MHz? Und das will ich momentan bei meinem Projekt machen (Code übersichtlicher gestalten)
Sven schrieb: > Atmel-Programmierung Ich glaube nicht, dass sich die Firma Atmel so einfach programmieren lässt. ;-) Du solltest also besser hinschreiben, was du denn für einen Prozessor oder Controller programmierst; Atmel baut ja nicht bloß einen einzigen. Sven schrieb: > Wären das nicht ein paar Nanosekunden bei einer taktfrequenz von 8MHz? Es ist eher eine Mikrosekunde oder ein bisschen mehr, denn es muss auf dem Stack eine Rücksprungadresse hinterlegt werden. Damit hast du schon mal mindestens zwei Speicherzugriffe (für 2 Bytes des PC), und die kosten je zwei Takte. Das allein sind dann schon 0,5 µs. (Das jetzt mal in der Annahme, dass mit „Atmel“ ein klassischer Atmel-AVR gemeint ist.) Dennoch solltest du dir um derartige Mikro-Optimierungen keine so großen Gedanken machen, solange das nicht irgendwo in einem zeitkritischen Pfad liegt. Wie schon geschrieben wurde, ist Modularisierung besser als ein riesiger Klumpen von main(), in dem alles drin ist.
Sven schrieb: > Wären das nicht ein paar Nanosekunden bei einer taktfrequenz von 8MHz? Bei 8MHz hat jeder Takt schon mal 125ns Dauer. Wenn du die Funktion nur einmal aufrufst, ist es wahrscheinlich, dass der Compiler gar keine Calls und Returns und Registersicherung durchführt. Es ist meine Vermutung, man könnte es an einem Beispiel im Assemblerlisting mal nachprüfen.
Wenn du den Compiler mit der Option -O2 aufrufst, dann optimiert er sehr kleine Funktionen automatisch weg. Zum Beispiel vor der Optimierung:
1 | int plus(int a, int b) |
2 | {
|
3 | return a+b; |
4 | }
|
5 | |
6 | int main() |
7 | {
|
8 | int result=plus(3,4); |
9 | }
|
Wird vom Compiler etwa so optimiert:
1 | int main() |
2 | {
|
3 | int result=7; |
4 | }
|
Zum einen ersetzt er die Funktion durch einen Einzeiler, zum Anderen ersetzt er eventuell sogar die Addition durch eine feste Zahl. Es kann sehr hilfreich sein, sich das Assembler Listing der erzeugten Codes anzuschauen. Bei der Gelegenheit lernt man dabei gleich ein kleines bisschen Assembler. Es lohnt sich, das zu lernen.
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.