Codegröße minimieren?

Gast #17154
Lesenswert?

Mit einem Projekt unter dem IAR Embedded Workbench und MSP430F149 habe 
ich Platzprobleme; es passt nun nicht einmal eine weitere kleine 
Funktion hinein.

Was für Minimierungsmöglichkeiten ausser Löschen von ungenutzem Code, 
möglichst kleinen Variablen, möglichst unsigned Variablen, möglichst 
möglichst lokale Variablen, möglichst define statt const oder enum, denn 
noch?


Bringt es etwas möglichst alle Variablen und Funktionen als static zu 
deklarieren und Funktionsargumente möglichst als const zu deklarieren?
#17155
Lesenswert?

Der MSP430F149 ist ja mit 60kB geradezu riesig.

Bei mir hat mein größtes C-Programm von 10052 Zeilen gerade mal 32965 
Bytes auf einem 8051.


Die angegebenen Tricks bringen nur minimale Einsparungen.

Die größten Einsparungen erzielt man nur durch Überarbeitung des 
Algorithmus.


Was ist das denn für ein Programm, was Du da entwickelst ?
Wenn Du uns mehr über Dein Projekt erzählst, kann man Dir vielleicht 
helfen.


Peter
Gast #17158
Lesenswert?

Darüber erfährt man mehr wenn man sich so ein Ergometer kauft und 
benutzt ;-)
Die Software verwaltet die Daten von  5 Usern (Alter, Gewicht, 
Fitness-Level usw.), berechnet den Strom mit dem die Wirbelsttrombremse 
betreiben werden muss, summiert gefahrene virtuelle Kilometer, summiert 
die abgegebene Leistung, kann rund 80 Programme (u. a. Tour de France 97 
- Streckenprofile) speichern u. abspilen, misst Puls über Brustgurt, 
Ohr-Lichtschranke oder Griffe usw.
In Software ist auch die Uhr realisiert.
Insgesammt sind es rund 100 Funktionen.
#17159
Lesenswert?

Denke mal, daß der meiste Speicher für die Bilddarstellung der 
Streckenprofile draufgeht. Eventuell kann man die Bilddaten in einen 
EEPROM 24C512 auslagern.

Ansonsten sehe ich jetzt nicht den großen Speicherfresser.

Der Vergleich mit dem 8051 ist natürlich etwas unfair, da der Keil-C51 
bekanntermaßen mit Abstand den kleinsten Code erzeugt (gegenüber allen 
anderen Kontrollerfamilien).

Ich hab jetzt auch keinen Anhaltspunkt, wie effizient der Compiler des 
MSP430 ist. Aber wenn man nicht wirklich größtenteils mit 16-Bit-Zahlen 
arbeiten muß, ist ein 16-Bitter schon prinzipiell speicherhungriger als 
ein 8-Bitter.

Sieh Dir doch einfach mal im MAP-File den Speicherverbrauch der 
einzelnen Funktionen an und versuche nur die größte zu optimieren.


Peter
Gast #17161
Lesenswert?

Danke; vielleicht kann ich die einsetzen, mal sehen :-)

Der MSPGCC-Beschreibung nach müsste der Code durch den Compiler-Wechsel 
wesentlich kleiner und schneller werden, weil er auch Divisionen durch 
ganzzahlige Exponenten von 2 bei der Optimierung als Shift-Operation 
realisiert. Beim IAR-Compiler funktioniert das Ersetzen durch Shift ja 
nicht mal wenn man es selbst macht und nur unsigned Variablen dafür 
nimmt. Mal sehen wie das mit dem MSPGCC funktioniert.
Gast #17166
Lesenswert?

Also fast 500 kB Source Code in C sind schon hart, aber in Assembler 
wohl kaum machbar bzw. viel aufwendiger.

Nachdem ich bei jeder Funktion extern inline ausprobiert habe und bei 
Erfolg stehen lies, konnte ich um über 15% reduzieren, aber bei einigen 
Funktionen beschwerte sich der mspgcc:

/tmp/cc6pr2zi.s:25749: Error: operand out of range: -513

Und es bleiben undabhängig davon noch einige relocation errors:

msp430-gcc -Wl,-s,-O,--verbose -mmcu=msp430x149 -Os -o aout.elf 
ergo2001.o assem.o ram_load.o
  ergo2001.o: In function `Com_Shell':
  ergo2001.o(.text+0xb5d2): internal error: unsupported relocation error
  ergo2001.o(.text+0xb5d8): internal error: unsupported relocation error
  ergo2001.o(.text+0xb5f2): internal error: unsupported relocation error
  ergo2001.o(.text+0xbad0): internal error: unsupported relocation error
  msp430-objcopy -O ihex aout.elf aout.elf.a43
  msp430-objdump -DS aout.elf >aout.elf.lst
  msp430-objdump: aout.elf: no symbols

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren