www.mikrocontroller.net

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


Autor: nobody0 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: nobody0 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: nobody0 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: nobody0 (Gast)
Datum:

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

Autor: nobody0 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: nobody0 (Gast)
Datum:

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

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es lebe die Assembler Programmierung !

SG Josef

Autor: nobodyo (Gast)
Datum:

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

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.