Hi, Bin in sachen c und winavr und ponyprog noch Anfänger. Hab mir jetzt ein Programm für ein belichtungsgerät geschrieben, bin noch nicht fertig aber die 2K vom 90s2313 sind schon voll. Bringt WINAVR nichtmal eine Warnung wenn der MC voll ist? Das ist schwach! Hab es erst gemerkt als bei ponyprog alles beschrieben war und mein Programm blödsinn gemacht hat. Bringt PonyProg denn auch keine Warnung? Nur AVRStudio meckert. Bin enttäuscht! Wie ist das, gibt es in WINAVR noch irgendwelche Einstellungen die mein Programm kleiner machen? mfg
Prinzipiell hast Du recht, daß es nicht so schön ist, wenn man keine Warnung bekommt. Aber bedenke mal, daß die Software, die Du benutzt, kostenlos ist. Das heißt: Irgendjemand hat einfach mal so seine Freizeit geopfert. WINAVR gibt während des Compiliervorgangs im make-Fenster auch die Codegröße an. Kleiner bekommst Du den Code, indem Du ihn effektiver machst... Es gibt wohl auch verschiedene Optimierungsparameter, aber da kennen sich andere sicher besser aus, als ich.
http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Optimize-Options.html#Optimize-Options beschreibt mögliche Parameter für die Optimierung. -Os -fweb -frename-registers -ffast-math dürfte so ziemlich den kompaktesten Code erzeugen.
Hi, Ich hab mal mit verschiedenen Optimierungslevels, mit Makefile, versucht die grösse zu drücken, bringt nicht viel. Hab jetzt mal mein Programm mitgeschickt (nicht schlagen, ist alles noch ein wenig chaos, und nicht dokumentiert) vielleicht hat jemand Zeit sich das Ding mal anzuschauen. Hab bestimmt irgendein Fehler gemacht, weil so lang ist die Source nicht. mfg
Wie ich sehe verwendest du an vielen stellen int. Versuch mal wenn möglich stattdessen uint8_t zu verwenden (deine Warteschleife könnte dann allerdings zu schnell sein) und bei den Berechnungen eine Typecast auf uint8_t . Generier mal das Assembler Listing. Da wirst du schnell sehen welcher Teil besonders Codehungrig ist.
das ersetzen von int durch uint8_t hat einiges gebracht, aber für meine vorhaben reicht der restliche Speicherplatz nicht mehr. Besetzt INT nicht genauso ein Byte wie uint8_t ???
in tasten() liest du ein Bitmuster ein 78h,74h.. => invertiere das ganze und verwende es gleich als "Tasten"-code (Zum Speichern brauchst du ja sowieso ein uint8) Gruss
Versuch case zu vermeiden und if.. else zu verwenden: http://www.mikrocontroller.net/forum/read-2-65661.html#new in laden() dürftest du das case durch if ((pos != 0) && (pos < 8)) { y = pos<<4; } ersetzen können Ansonsten sind inp und outp sowie eeprom_read_byte übrigens veraltet: http://www.mikrocontroller.net/forum/read-2-138701.html#new Und im Notfall ließe sich info() einsparen ;-) was für Routinen für das LCD verwendest du denn?
@T.Stütz Ich könnte besser mit "bit_is_clear" arbeiten, als immer den ganzen Port abzufragen oder? @malte Verwende den Quellcode von Peter Fleury. Wobei ich sie ein wenig ergenzt hab, weil mit die Darstellung von Integer Zahlen nicht gefallen hat. Eine führende 0 wird vernachlässigt und das sieht doof aus wenn der man eine zeit darstellen will.
UUPS erwischt - bin leider kein AVR-Programmierer aber wenn dieses MAKRO einen einzelnen Maschinencode erzeugt dann JA!! Gruss
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.