Forum: Compiler & IDEs Code optimieren, DCF_77


von Hermann G. (hahgeh)


Angehängte Dateien:

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

von Peter D. (peda)


Lesenswert?

Hier ist mal meine Version:

http://home.tiscali.de/peterd/appl/soft/c51/thclock/index.htm

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


Peter

von Malte _. (malte) Benutzerseite


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...

von Hermann G. (hahgeh)


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

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.