Weiß jemand wie ich das verkleinern kann. Compiler Optimiert schon auf
Größe.
Das komische: Wenn ich die case 4 und 6 auseinandernehme und das ganze
ohne die Addfunktion schreibe, komm ich auf ein viertel der Größe,
allerdings steht dann alles doppelt da und ich würde es lieber mit so
und damit übersichtlicher machen.
Danke, Peter. Du hattest Recht das hat 2KB gekostet.
Kann man den Code vielleicht noch mehr optimieren, bzw. ist es so
sinnvoll das mit switch zu machen, oder gibt es da bessere
Möglichkeiten?
Samuel K. schrieb:> Kann man den Code vielleicht noch mehr optimieren, bzw. ist es so> sinnvoll das mit switch zu machen, oder gibt es da bessere> Möglichkeiten?
so schlimm ist der code nicht. Aber am meisten kann man sparen wenn man
die genau funktion eines Programmes kennt. Leider kann man anhand der
paar zeilen nicht wirklihc erkennen was das ding genau macht.
Die Funktion regelt die Eingabe einer Schachuhr. Die Funktion KeyRo
bekommt da als Argumente ein Modus, der angibt was eingestellt wird, und
das wird in der switch abgefragt. Die Maske bestimmt dabei nur welche
Digits der 8stelligen 7Segment Anzeige benutzt werden.
GetKey gibt eine Taste entprellt zurück sobald sie gedrückt ist.
Hier ist nochmal der korrigierte Code, da ein paar kleine Fehler in
KeyRo drin waren (ich konnte ihmnja nicht testen, da er zu groß war).
Switch ist schon recht effektiv.
Aber man kennt von Deinen Variablen nicht den Typ, daher kann man keine
Optimierungen angeben.
Versuche, möglichst kleine Typen zu nehmen (uint8_t) und möglichst wenig
globale Variablen.
Wenn Du Code postest, sollte er auch compilierbar sein, d.h. Prototypen
für alle benutzten Variablen, Funktionen und Macrodefinitionen!
Im Assemblerlisting kann man nämlich am besten sehen, wo es klemmt.
Peter
Ok, hier ist der ganze Code zum kompilieren. Die Funktion oben ist die
viertletzte.
PS: Wer zufällig einen Max7219 an einem Maga hängen hat, kann es sogar
testen. Allerdings braucht man noch eine Matrixtastur.
Peter Dannegger schrieb:> Switch ist schon recht effektiv.
Bei Mehrfach-Cases (wie in diesem Fall) kann der Schuss aber auch nach
hinten losgehen. Ich habe schon erlebt, dass hier eine if-else-if-Kette
mit Or-Verknüpfung statt der Mehrfach-Cases wesentlich kleineren Code
erzeugt. Vielleicht sollte Samuel den "Unter-Switch" für die Fälle 4 und
6 mal als if-else-if-Kette umformulieren.
Gruß,
Frank
Frank M. schrieb:> Ich habe schon erlebt, dass hier eine if-else-if-Kette> mit Or-Verknüpfung statt der Mehrfach-Cases wesentlich kleineren Code> erzeugt.
Ich habe immer nur das Gegenteil erlebt.
Beim Switch versucht er nämlich, ähnlichen Code von Cases zusammen zu
fassen.
Man sieht eigentlich immer, daß er in andere Cases hineinspringt, obwohl
das nicht so im Code steht.
Bei if/else läuft aber alles nacheinander ab und daher kann er nicht
mehr ähnlichen Code mehrfach nutzen.
Peter
Danke für die Optimierungargumente. Kannst du mir vielleicht noch sagen
wie ich die im MAkefile einbinde (hab noch nie ein Makefile selber
geschrieben)?
OK ich hab das jetzt geschafft. Aber wenn ich die letzte Zeile als
Compiler Flag einsetze kommt ein Linker Error, dass er meine 2
Funktionen in main nicht findet.
Samuel K. schrieb:> Aber wenn ich die letzte Zeile als> Compiler Flag einsetze kommt ein Linker Error, dass er meine 2> Funktionen in main nicht findet.
Diese Flags darfst du nur verwenden, wenn dein Projekt entweder nur aus
einer einzigen Sourcedatei besteht, oder wenn alle Sourcen mit einem
einzigen Compileraufruf in einem Rutsch kompiliert und gelinkt werden.
Letzteres wird wohl in deinem Makefiles nicht gemacht (ist auch eher
selten der Fall), deshalb kannst du die Flags so nicht verwenden.
Andreas