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
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.