www.mikrocontroller.net

Forum: Compiler & IDEs Code optimieren, DCF_77


Autor: Hermann Günther (hahgeh)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, hat jemand etwas Zeit zuviel, um den meinen Speicher zu schonen?

Ich habe diese DCF_77-Uhr geschrieben, der erzeugte Code ist mir mit
1324 Byte aber irgentwie noch zu groß.

Bis Zeile 25 bin ich schon gekommen :).

Im main() wird nur die Init-Funktion aufgerufen und dann ewig
gewartet.

Vorher hatte ich noch alle 59 DCF-Bits in einer long long Variable,
aber dann bläht sich das total auf (...total angeberisch).

Vielleicht hat ja jemand einen Gedankenblitz.

mfgvhg

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist mal meine Version:

http://home.tiscali.de/peterd/appl/soft/c51/thcloc...

Die DCF7-Decodierung ist etwa 250 Byte, mit dem AVR wirds ein kleines
bischen mehr (aufm ATTiny26 getestet).


Peter

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Tip:
Die case Anweisungen durch einzelne if ersetzen, spart bei gcc und
8Bittern Code.

2.Tip:
Die globalen volatile Variablen brauchen immer relativ viel Code bei
jedem Zugriff. Leg in der Interrupt Routine lokale Variablen mit einer
Kopie der globalen Variable an und verwende nur diese, da mit etwas
Glück die so in den Registern bleiben. Am Ende des Interrupts musst du
die dann natürlich wieder zurück kopieren wenn sie verändert wurden.
Lohnt sich natürlich nur wenn die gleiche Variable mehrfach im
Interrupt verwendet wird.

3. Tip:
Assembler Ausgabe durchsehen und überlegen wo es besser gehen könnte.

4. Tip, auch wenns nichts mit der Code Größe zu tun hat:
Achtung wenn globale Variablen die, größer als 8Bit sind, innerhalb und
außerhalb eines Interrupts verwendet werden. Eventuell ist erst die
Hälfte der Variable im Speicher geändert/ausgelesen und genau dann
trifft ein Interrupt auf und verändert diese...
z.B.
a= 0x00ff
Programm liest a aus, wird nach den oberen 8 Bits aber unterbrochen
Interupt macht a++;
Programm wird weiter ausgeführt und liest jetzt die unteren 8Bit
und verhält sich als ob a = 0x0000 wäre...

Autor: Hermann Günther (hahgeh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
mit euren Tips habe ich es nun geschafft die Codegröße auf (bis jetzt)
958 Byte zu reduzieren. :) Das sind immerhin schon fast 400 Byte
weniger.

Also von Peter habe ich das Prinzip der seriellen Dekodierung mit
Codetabelle im Flash und die Abspeicherung der Zeit in einer Struktur
übernommen.
Damit fällt auch die lange case-Anweisung weg.
zu 2.Tip:
Hat wunderbar funktioniert, allerdings muß eine Variable schon
mindestens 3x im Interrupt verwendet werden, damit es was bringt.
Das Anlegen einer Kopie und Zurückschreiben bei einer gesamten
struct-Variable hat dabei seltsamerweise keinen Vorteil gebracht, wenn
man allerdings alle Struckturelemente einzeln kopiert und
zurückschreibt funktioniert es (keine Ahnung warum).

zu 3.Tip:
hat auch noch hier und da ein paar Bytes gebracht.

zu 4.Tip:
habe jetzt einen besser teilbaren Quarz eingebaut, damit ich den
Vorteiler benutzen kann und kein ints mehr brauche. Dabei wurde
natürlich auch noch wieder etwas Speicher frei.

Vielen DAnk und emefGehvauhahgeh

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.