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?
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
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.
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
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.
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
"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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.