Code optimieren, DCF_77

OP #283741
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
Angehängte Dateien:
Persönliche Seite #283743
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...
OP #283744
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

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