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
#17157
Lesenswert?
• ▲
▼
Und wo auf dieser Seite erfährt man mehr darüber ???

Was muß denn diese Ergometersoftware alles machen ?

Hab aber nicht den Eindruck, daß es so viel ist, um
60kB auch nur zur Hälfte aufzufressen.

Vielleicht hast Du sehr viel linearen Code und kaum
versucht ähnliche Funktionen mit Unterprogrammen
zu realisieren.


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 #17164
Lesenswert?
• ▲
▼
Aha. Mal sehen ob ich die vorhandene Uhr ersetzen kann. Mit der gab es 
nämlich kürzlich das Prolblem das die unter Umständen falsch ging und 
vermutlich lag das an einem der Energiespar-Modi.
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.