Forum: Mikrocontroller und Digitale Elektronik Optimierungsproblem


von LinkerNewbe (Gast)


Lesenswert?

Moin moin..
Wie kann ich verhindern (bei STM32F4 + Eclipse[JUNO] + Yagarto) das mir 
bei der Optimierung Os die Zeilen
1
  for (unsigned int i=0; i<length; i++)
2
  {
3
      *(unsigned char *)&raus[i] = Funktion(parameter);
4
5
  }
meinen Code um gute 20K wachsen lässt????

während
1
  for (unsigned int i=0; i<length; i++)
2
  {
3
      *(unsigned char *)&raus[   0   ] = Funktion(parameter);
4
5
  }
20K kleiner ist.

Lediglich die Änderung von raus[i] zu raus[0] spart 20K....ich brauche 
aber raus[i]. Der Funktionskopf sieht so aus:
1
unsigned short Funktionskopf(unsigned int parameter, char *raus,  unsigned int length)
i und length waren vorher vom Typ unsigned char. Änderungen auf int 
brachten Teilerfolge beim Herumspielen mit den Optimierungsstufen.

Der Linker bindet mir ein Haufen von Libfunktionen ein z.B. svfprintf, 
welche ich nie benutze bzw. im gesamten Quelltext nicht enthalten sind.
Änderungen an den Optimierungssettings waren nicht sehr erfolgreich.
Kann ich dem Linker sagen, dass er genau diese svfprintf weglassen 
soll??

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

LinkerNewbe schrieb:
> Lediglich die Änderung von raus[i] zu raus[0] spart 20K....
Was meinst du wie viel es spart wenn du das Programm auf ein leeres 
reduzierst ;-)

> ich brauche aber raus[i]
Es ist doch wohl logisch, das ein Programm, welches mehr tut auch mehr 
Platz braucht.
Ohne mehr Details könnte z.B. der Grund sein, dass der Compiler die 
(statische) Zuweisung im Vorausberechnet und so z.B. keine Floatingpoint 
Rechnung zur Laufzeit nötig ist.

von Franzi (Gast)


Lesenswert?

na, ich denke mal da könnte "Loop-Unrolling" und "Function-Inlining" die 
Ursache sein. Wie gross sind den "length" und die Funktion "Funktion" ?

von Peter D. (peda)


Lesenswert?

LinkerNewbe schrieb:
> Der Linker bindet mir ein Haufen von Libfunktionen ein z.B. svfprintf,
> welche ich nie benutze

Du wirst schon eine Funktion der printf-Familie drin haben.

Vermutlich wird bei raus[0] eine Konstante ausgegeben, der Compiler 
merkt das und nimmt das leichtere puts zur Ausgabe.

von LinkerNewbe (Gast)


Lesenswert?

Mehr Platz ist klar aber 20K sind zuviel.
Habe auch eine Zeile in der lediglich die Übergabe eines define-wertes 
meinen Code um diese 20K aufbläst.

Klartext:
Varible=Wert; (Variable ist unsigned short UND #define Wert 0x8000)

Er braucht z.B. die svfprintf nie... selbst ein Breakpoint an der 
svfprintf-map-Adresse wird nie aufgerufen.
Gibt es eine Möglichkeit wie "-Xlinker --gc-symbols" für Yagarto...das 
Selbe war mit sections auch schon erfolgreich!
Er zieht mir zuviele unnötige Funktionen aus der lib.c raus!!!!!
Somit vermute ich das Problem weniger im Code sondern eher im Yagarto...

von LinkerNewbe (Gast)


Lesenswert?

sprintf ist mit dabei stimmt aber kein svfprintf. Die braucht alleine 
schon gute 4KB. Stimmt meiner Meinung nach nicht ganz mit dem Simm von 
Os überein, da die sprintf wesentlich kleiner ist.
Kann ich dem linker die svfprintf-include irgendwie verbieten !!!

von Εrnst B. (ernst)


Lesenswert?

LinkerNewbe schrieb:
> sprintf ist mit dabei stimmt aber kein svfprintf. Die braucht alleine
> schon gute 4KB. Stimmt meiner Meinung nach nicht ganz mit dem Simm von
> Os überein, da die sprintf wesentlich kleiner ist.

weisst du warum sprintf kleiner ist?
Einfach weil das ein blöder wrapper um svfprintf ist. Bringt nur die 
Parameter in die richtige Form und gibt ab.

d.h. ohne svfprintf gibt's kein sprintf.

von LinkerNewbe (Gast)


Lesenswert?

OK. Die Info ist neu, das ne sprintf 4K brauchen kann. AVR war so 
schön...

Selbst ohne die Funktionwertrückgabe spare ich 20K.

Groß
*(unsigned char *)&raus[i] = 0;

Klein
*(unsigned char *)&raus[0] = 0;

warum er auch bei diesen Zeilen die svfprintf mit einbezieht ist 
fraglich.....

zusätzlich zieht er mir auch Funktionen wie
__ssprint_r
_dtoa_r
mit rein.

Habe diese Woche eine Formel mit sin,cos,exp und round aus dem Program 
geschmissen da die Grundfunktionen dafür auch schon 8K gebraucht haben.

Letzte Frage
Wozu ist die dtoa-Funktion.

Fazit--> sprintf muss raus
Wenn ich die 10-sprintf-befehle aus dem Programm verbanne, müssten ja 
die 4K der svfprintf auch wegfallen.....

von Uwe (Gast)


Lesenswert?

> STM32F4
Hat doch 1MByte Flash, was kratzen dich da die 4Kbyte ?

von LinkerNewbe (Gast)


Lesenswert?

Eigener Bootloader, der nur eine bestimmte Größe haben soll. Das Löschen 
der sprintf-Befehle brachte die Lösung. Nun heisst es eine kleinere 
Ersatzfunktion zu finden oder zu schreiben.

von Peter D. (peda)


Lesenswert?

LinkerNewbe schrieb:
> Nun heisst es eine kleinere
> Ersatzfunktion zu finden oder zu schreiben.

puts + itoa/ftoa

von Urlauber (Gast)


Lesenswert?

Was macht er bei:

 raus[i] = 0;

??

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.