hi Ich habe momentan ein Problem mit fertigen libs. In einigen Funktionen sind große Arrays/structs drin die zwar regulär auf den Stack/Heap geworfen werden aber mir dann an anderer Stelle Kopfweh bereiten. Weil ich nie 100%ig weiß wieviel wirklich frei ist. Gibt es tools die arrays in funktionen anzeigen / finden können? Ich habe jetzt per hand angefangen zu suchen... Das ist bei mehreren hundert Dateien jedoch extrem aufwändig. Ich nutze einen STM32F4 mit RTOS und mehreren Tasks. Problem ist das ich künstlich den Stack aufblasen und zusätzlich ~10k Heap freilassen MUSS damit es läuft. Einige Größere Array/structs habe ich nun auf dynamisches Speichermanagement umgestellt was auch erfolg gebracht hat. Als Dynamischen malloc bereich nutze ich die 64k CCM .. hier ist auch noch recht viel Frei ~50-60% Das würde mich nicht stören wenn dieser bereich zeitweise zugebombt wird. Für Vorschläge bin ich dankbar.
Ist doch egal, ob Du nun mehr RAM für den Stack oder für den Heap reservierst. Der maximal benötigte RAM ist genau derselbe. Bzw. beim Stack ist es etwas weniger, da der Verwaltungsoverhead wegfällt. Malloc bringt nur dann etwas, wenn die benötigte Größe zur Compilezeit unbekannt ist oder das Array über das Funktionsende hinaus benötigt wird. Was allerdings sinnvoll ist, mal die großen Arrays auf die wirklich benötigte Größe abzuklopfen. Oftmals verteilen Programmierer den RAM gedankenlos mit der Schöpfkelle, d.h. revervieren viel mehr, als nötig.
Hi danke schonmal Ich habe teil unbekannte größen, teile bekannte. Die kleinen bekannten größen bleiben auch so... das betrifft meist funktionen mit berechnungen ( TLS Stack ) dazu habe ich noch andere buffer die aktuell wirklich oversized sind diese kann ich ja in DYN RAM umwandeln. Mir geht es auch darum das ich noch etwas Speicher übrig habe. Ich musste bisher immer die 10K reserve lassen. Wenn ich das auf 2-3 k einstampfen kann ist das für mich voll OK. Damiot kann ich aber ggf noch weitere funktionen einbauen.
C++ vector<> benutzen. Damit kann man das Array auf die benötigte Größe verkleinern.
jktotukgkg schrieb: > Gibt es tools die arrays in funktionen anzeigen / finden können? Gibt es bestimmt. Zur Not mach dir selbst eins mit libclang oder als gcc plugin, wenn dir grep nach eckigen Klammern nicht reicht (weil es auch Arayzugriffe findet). Aber würde es dir auch reichen, zu wissen wie viel Stack eine Funktion braucht? Die auf dem findest du dann mit grep malloc.
1 | gcc -fstack-usage |
Sebastian schrieb: > Die auf dem findest Mist. Da fehlt "heap". Muss mich wohl doch mal anmelden, damit ich editieren kann :-)
Das liefe darauf hinaus einen eigenen C / C++ parser zu schreiben und da kann ich dir aus eigener Erfahrung sagen: vergiss es. Man kann Array Typen auf so viele Arten in den beiden Sprachen schreiben und dann hinter Klassen und typedef verstecken, daß du mittels regulärer Ausdrücke niemals alle finden wirst. Dazu ist die C Typ Grammatik dermaßen verpfriemelt, daß du auch mit Lexx/Yacc graue Haare kriegen wirst. Die einzige Lösung ist wie oben beschrieben sich in den gcc Compiler einzuklinken und den AST an geeigneter Stelle auszuwerten. Oder eine Lösung anzustreben, die ohne dieses Wissen auskommt.
Man könnte den Stack mit einem Muster füllen, z.B. 0x77, dann die Funktion aufrufen und danach prüfen, wieviel von den 0x77 noch übrig sind.
Vielen Dank Stack habe ich nicht so das Problem. RTOS hat ja statistic funktionen die mir dazu helfen. Ich habe parallel zur eigentlichen Funktion eine HTTPS webseite mit den ausgaben der Tasks und deren Verbrauch. Die TLS lib und eine andere lib brauchen aber in funktionen manchmal viel RAM.
1 | void foo( ... ){ |
2 | char buf[4096]; |
3 | // oder
|
4 | structmit_daten data; |
5 | |
6 | // mach was mit buf ... oder data
|
7 | }
|
... das macht mir derbe kopfschmerzen. Die konstrukte sind teils mehrere hundert bytes bis kbytes groß die werden aber nicht in den stack gelegt... sondern auf den heap. Der ist derzeit noch gut frei, ich würde aber gerne wissen wieviel. auf 1-2kbytes kommt es mir nicht an. aber wenn ich jetzt zB ein feature einbaue was viel RAM brauch, kann es ja passieren das es kracht. Ich will nun diese dicken bereiche( alles >64byte ) gegen dynamischen Speicher aus dem RTOS heap_4 austauschen. Sie werden ja auch nur temporär benötigt. Problematisch ist eben das auffinden dieser arrays/structs in den untiefen der libs. Dachte da gibts evtl ne Anzeigemöglichkeit.
Im letzten Beispiel liegt die Variable buf am Stack, also genau dort wo sie hingehört. Wie bereits von Sebastian geschrieben kannst du dies mit gcc -fstack-usage ausfindig machen.
hi habe jetzt mal alle .su durchgeschaut und noch einige große blöcke gefunden. in den .su Dateien steht jedoch immer am ende "static" Konnte jetzt den stack deutlich reduzieren. danke
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.