Forum: Mikrocontroller und Digitale Elektronik Atmel Programmierung


von Sven (Gast)


Lesenswert?

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?

von Hoschti (Gast)


Lesenswert?

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

von Sven (Gast)


Lesenswert?

Wären das nicht ein paar Nanosekunden bei einer taktfrequenz von 8MHz?

Und das will ich momentan bei meinem Projekt machen (Code 
übersichtlicher gestalten)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von HildeK (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.