Forum: Compiler & IDEs Wie kann man diesen Code optimieren


von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich hab hier mal was für Leute die ein bissl Zeit und Lust haben, sich
diesen Code mal genauer anzusehen. Es geht um einen Bitmustergenerator
mit nem AT90S8535. Ich hab das Gerät inzwischen komplett aufgebaut
(also änder ich die Hardware nicht mehr...) und mir fallen noch ein
paar kleine Erweiterungen ein. Das Problem ist nur, dass der Code so
schon fast den Controller sprengt.
Jetzt wüsste ich halt gerne, wie ich den ein bisschen effizienter
schreiben könnte (vielleicht noch mehr Funktionen?)
Vielleicht fällt dem einen oder anderen noch was ein.
Nebenbei, ich nutz den AvrGCC, und hab auch schon beste Optimierung
aktiviert...
Viele Grüße und Danke
Martin

von Peter D. (peda)


Lesenswert?

Da fehlt noch lcd.h

Hast Du mal ins Listing geschaut, welche Funktionen Dir zu groß
erscheinen, die man optimieren könnte ?



Peter

von Matthias (Gast)


Lesenswert?

Hi

Die paar Zeilen sollen 8k Code geben? Kann ich nicht glauben. Wenn du
eine compilierfähige Version (die lcd.h und deren Implementation fehlt)
lieferst würde ich das mal durchprobieren.

Das einzige was knapp werden könnte ist das RAM da du unter anderem
relativ viele Strings nicht im Flash ablegst.

Ich würde das ganze auf etwa 2-3k schätzen (kenne die lcd.c zwar nicht
aber so ein HD44780 ist ja nicht gerade hochkomplex)

Was mir auffällt ist das du viele Variablen global definierst. Warum?
Lokale Variablen sind fast immer ausreichend und werden "dynamisch"
auf dem Stack angelegt.

Matthias

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

das mit der variablendeklaration ist mehr oder weniger unabsichtlich,
was c angeht bin ich ziemlicher anfänger, das ist mein erstes größeres
ding!
im anhang sind die 3 dateien: pat_gen_2.c, lcd.c und lcd.h
die lcd-routinen sind die von peter fleury, bei dem ich mich an dieser
stelle ausdrücklich bedanke!
ich glaube es liegt an der lcd.c, dass der code so dick wird,
vielleicht kann man da was rausschmeißen?

wenn ich das so richtig sehe, sind die ganzen strings, die aufs lcd
kommmen, doch im flash...zumindest sieht die hex-datei nachher ziemlich
danach aus (erinnert mich an asm-zeiten, ganz am ende der datei die
ganzen strings mit nem punkt dahinter...) also eigentlich müssten die
im flash sein, was nachher im RAM ist, ist das array mit den max 100
speicherwerten wie die ganzen variablen oben, aber das sind ja noch
kein e 256 Byte

von Matthias (Gast)


Lesenswert?

Hi

das die Strings im Flash liegen ist klar. Irgendwo müssen sie ja
gespeichert werden. Beim start deines µC werden aber alle Strings ins
SRAM kopiert die du nicht expliziet als PROGMEM deklarierst und
spezielle behandelst. Aber zu dem Thema gibt es genug Beiträge hier im
Forum.

Bei mir compiliert dein Code zu 3,1k Code. Also noch reichlich Platz im
8535. Verwechselst du etwa HEX Dateigröße mit der Größe des Programm im
Flash?

Matthias

von Martin (Gast)


Lesenswert?

ich glaub schon....
wo seh ich denn die größe, die es nachher im flash belegt?

von Malte Marwedel (Gast)


Lesenswert?

avr-size dateiname.hex
gibt den benötigten Flash Speicher aus. Ansonsten hab ich mal gelesen,
dass Dateigröße geteilt durch 2,8 die ungefähre Programm Größe ergibt.

von Tobi (Gast)


Lesenswert?

ansonst die hex datei in avrstudio im simulator laden. da zeigt der auch
genau an bis wohin der code geht

von Alexander Höller (Gast)


Lesenswert?

Das ganze kann man auch sehr schön nach jedem Compilieren anzeigen
lassen:

avr-sizex.exe ins /bin Verz. von WinAVR kopiern

und Makefile so umschreiben:

# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf
SIZEX = avr-sizex --mcu=$(MCU) $(TARGET).elf

sizebefore:
  @echo
  @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE);
$(ELFSIZE); echo; fi


sizeafter:
  @echo
  @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER);
$(ELFSIZE); echo; fi ;$(SIZEX)


(siehe: http://www.kreatives-chaos.com/index.php?seite=avrgcc )

mfG
aleX

von Martin (Gast)


Lesenswert?

@ alexander: danke für den tipp, kann man gut gebrauchen, v.a. die
schöne darstellung der speicherbelegung ;-)

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.