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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.