Atmel Programmierung

Gast #5282813
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?
Gast #5282820
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
Moderator Persönliche Seite #5282846
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.
Gast #5282850
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.
Gast #5282861
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.

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