Wie viel RAM benutzt meine Applikation?

Gast #3352060
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
Gast
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
Gast
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.
Gast
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?
Gast
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.
Gast
"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.
Gast
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
Gast
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.
Gast
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.