mikrocontroller.net

Forum: Compiler & IDEs Wie kann man diesen Code optimieren


Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fehlt noch lcd.h

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



Peter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

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

Autor: Malte Marwedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobi (Gast)
Datum:

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

Autor: Alexander Höller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.