Forum: Mikrocontroller und Digitale Elektronik Keine Warnung wenn Prog. Speicher voll?


von michi (Gast)


Lesenswert?

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

von thkais (Gast)


Lesenswert?

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.

von Malte (Gast)


Lesenswert?

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.

von michi (Gast)


Angehängte Dateien:

Lesenswert?

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

von Malte (Gast)


Lesenswert?

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.

von michi (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

Nein, int hat mindestens 16 Bit.

von T.Stütz (Gast)


Lesenswert?

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

von Malte (Gast)


Lesenswert?

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?

von michi (Gast)


Angehängte Dateien:

Lesenswert?

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

von T.Stütz (Gast)


Lesenswert?

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