Forum: Mikrocontroller und Digitale Elektronik Codegröße minimieren?


von nobody0 (Gast)


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?

von Peter D. (peda)


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

von nobody0 (Gast)


Lesenswert?

Es sind Programme für Fahrrad-Ergometer:

http://www.ergobike.de/de/index.html

Daten wie Alter von User 4 werden schon in ein EEPROM ausgelagert.
Groß umstellen kann man da nicht viel, auch weil die Dokumentation 
praktisch fehlt; der Code ist sozusagen selbstdokumentierend.

von Peter D. (peda)


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

von nobody0 (Gast)


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.

von Peter D. (peda)


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

von Peter D. (peda)


Lesenswert?

"In Software ist auch die Uhr realisiert."

Hier findest Du meine Uhr mit Datum:

http://www.specs.de/~danni/appl/soft/c51/thclock/clock.lst

Ist aber mit 224 Byte Code und 7 Byte Daten nicht der Rede wert.


Peter

von nobody0 (Gast)


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.

von nobody0 (Gast)


Lesenswert?

Noch ne Frage zu der Uhr: nach den Angaben ist die für 8051, also doch 
nicht für MSP430, oder?

von Peter D. (peda)


Lesenswert?

Ist ja in C, somit es ist egal, ob 8051 oder MSP430.

D.h. nur der Timerinterrupt zur Erzeugung des 1s-Taktes muß an den Timer 
des MSP430 angepaßt werden.


Peter

von nobody0 (Gast)


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.

von Josef (Gast)


Lesenswert?

Es lebe die Assembler Programmierung !

SG Josef

von nobodyo (Gast)


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

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.