Guten Tag, Ich wollte mal nachfragen, mit welcher Option / unter welcher Linker-Datei ich nachschauen kann, wie viel RAM mein kompiliertes Programm benutzt. Denn der RAM auf meinem Entwickler-Board ist sehr knapp gegeben und ich will ja schließlich rausfinden wie viel ich davon benutze, bevor er ich weitere, optionale Dinge implementiere. Gruß, Heinz
Peter II schrieb: > woher soll denn der linker den RAM verbrauch kennen? Hallo Peter II, Beim zusammensetzen des Programms muss doch der GCC irgendwie wissen, wie viel RAM gesammt verbraucht wird. Denn wenn ich die Optimierung -Os wegfallen lasse, meldet er mir, dass der RAM des Boards nicht ausreicht. Vllt. sollte ich noch sagen, dass ich den arm-none-eabi-gcc benutze, samt Eclipse auf Linux. Gruß, Heinz
Der Heinz schrieb: > Vllt. sollte ich noch sagen, dass ich den arm-none-eabi-gcc benutze, > samt Eclipse auf Linux. - Linker Mapfile - arm-none-eabi-objdump
Peter II schrieb: > woher soll denn der linker den RAM verbrauch kennen? Hu?? Wer, wenn nicht der Linker, könnte ihn denn sonst kennen?
Der Heinz schrieb: > Beim zusammensetzen des Programms muss doch der GCC irgendwie wissen, > wie viel RAM gesammt verbraucht wird nein muss er nicht. Weil zum Ram der Stack gehört und diese kann er nicht überblicken. (recursive funktionen!) und es reicht schon ein malloc( rand(100) ); schon geht es auch nicht mehr. oder ein
1 | void foo( const int a ) { |
2 | int x[a]; |
Der Linken kennt maximal, die globalen und static variablen aber nicht mehr.
A. K. schrieb: > Hu?? Wer, wenn nicht der Linker, könnte ihn denn sonst kennen? niemand. siehe vorheriges Post.
Er weiß nur, wieviel RAM Du statisch verwendest. Für Stack und Heap wird wenn überhaupt nur ein Bereich vorgesehen (je nach Compiler/Linker/OS). Wieviel davon Du verbrauchst weiß der Compiler/Linker nicht. Den Stackverbrauch kannst Du (fast) nur zur Laufzeit ermitteln oder mit entsprechenden Analysetools. Eine gern verwendete Methode ist das Initialisieren des RAMs im Startup mit einer Magic Number (z.B. 0xAFFE) und dann zur Laufzeit (z.B. mit dem Debugger) zu schauen, wieviele Affen noch da sind. Um welche Architektur geht es denn?
Der Heinz schrieb: > Beim zusammensetzen des Programms muss doch der GCC irgendwie wissen, > wie viel RAM gesammt verbraucht wird. Er weiß, wieviel durch statisch allokierte Variablen verbraucht wird. Was du noch dynamisch machst (malloc und co) und was der Stack braucht, ergibt sich erst zur Laufzeit des Programms. > Vllt. sollte ich noch sagen, dass ich den arm-none-eabi-gcc benutze, > samt Eclipse auf Linux. Den statischen Anteil kannst du dir mit dem Tool arm-none-eabi-size ausgeben lassen.
"arm-none-eabi-gcc" hab' ich übersehen. In Deinem Linkerskript wird wahrscheinlich eine (Mindest-)Größe für Stack und Heap angegeben. Falls Du kein malloc, new, o.ä. verwendest, könntest Du den Heap auf 0 runterschrauben und den RAM anderweitig verwenden.
Hallo Ma, Das hört sich sehr interessant an. Mein Board hat einen USB-Anschluss, dem eigentlich einen bestimmten Bereich im RAM zugewiesen ist. Da ich aber kein USB benutze, möchte ich diesen Bereich im Speicher "losreißen" und ihn als statischen RAM verwenden (für globale Variablen oder ähnliches), bzw. dazu mappen. Das selbe sollte auch mit dem Heap passieren. Leider weiß ich keinen Ansatz, wie ich das realisieren könnte. Kennt sich damit jemand aus? Gruß, Der Heinz
Der Heinz schrieb: > Leider weiß ich keinen Ansatz Einen Ansatz habe ich: Lese mal die Doku zu deinem Linker.
Ohne Dein Linkerskript zu kennen, kann Dir da niemand helfen. Und ohne den Prozessor zu kennen, kann Dir auch niemand sagen, ob Dein Vorhaben (USB-Speicherbereich verwenden) realisierbar ist.
Ma schrieb: > Ohne Dein Linkerskript zu kennen, kann Dir da niemand helfen. > Und ohne den Prozessor zu kennen, kann Dir auch niemand sagen, ob Dein > Vorhaben (USB-Speicherbereich verwenden) realisierbar ist. Was meinst du mit Linkerscript? Bin grad verwirrt
Das Linkerscript ist eine Datei, die dem Linker sagt, was er tun soll... z.B. Welche Speicher gibt es, an welchen Adressen sind die, welche Segmente sollen in welchen Speicher, etc. Dem gcc (bzw. ld) wird per -T oder --script gesagt, wo er die Datei findet - schau einfach mal in Dein Makefile.
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.