Forum: Mikrocontroller und Digitale Elektronik ATMega644-Programm: Wieviel SRAM ist noch frei?


von Ups (Gast)


Lesenswert?

Unten sind die Make-Ausgaben (WinAVR, GCC) für den Server von Ulrich 
Radig.

Wieviel SRAM ist noch frei?

Size before:
Hexfiles/Webserver_MEGA644.elf  :
section             size      addr
.data                620   8388864
.text              51320         0
.bss                2981   8389484
.debug_aranges       800         0
.debug_pubnames     9068         0
.debug_info        52247         0
.debug_abbrev      12550         0
.debug_line        30693         0
.debug_frame        3792         0
.debug_str          8406         0
.debug_loc         23968         0
.debug_ranges       1016         0
Total             197461


Size after:
Hexfiles/Webserver_MEGA644.elf  :
section             size      addr
.data                620   8388864
.text              51368         0
.bss                2981   8389484
.debug_aranges       800         0
.debug_pubnames     9068         0
.debug_info        52317         0
.debug_abbrev      12550         0
.debug_line        30765         0
.debug_frame        3792         0
.debug_str          8412         0
.debug_loc         23968         0
.debug_ranges       1016         0
Total             197657

von Peter II (Gast)


Lesenswert?

Ups schrieb:
> Wieviel SRAM ist noch frei?

keine Ahnnung, kann man dort nicht ablesen. Soetwas weiss der compiler 
auch nicht.

von Spu (Gast)


Lesenswert?

Und wie kann man es fesstellen?

von Josef D. (jogedua)


Lesenswert?


von Falk B. (falk)


Lesenswert?

Flash = .text

SRAM (statisch) = .data + .bss

Den dynamischen RAM-Verbrauch deiner Funktion muss man während der 
Laufzeit messen, entweder mit passenden Tools oder mit dem Simulator. 
Darüber gibt es diverse Threads im Forum.

http://www.mikrocontroller.net/search?query=%2BRAMverbrauch+%2Bavr&forums[]=1&forums[]=19&forums[]=9&forums[]=10&forums[]=2&forums[]=4&forums[]=3&forums[]=6&forums[]=31&forums[]=17&forums[]=11&forums[]=8&forums[]=14&forums[]=12&forums[]=7&forums[]=5&forums[]=15&forums[]=13&forums[]=18&forums[]=16&max_age=-&sort_by_date=0

von Marek N. (Gast)


Lesenswert?

Du kannst den unbenutzten RAM mit einem charakteristischen Muster 
beschreiben ("painten") und gucken welcher Bereich vom Stack und den 
Daten überstrichen wird: https://www.youtube.com/watch?v=cDaG1CdP5Ew

Beste Grüße, Marek

von Ups (Gast)


Lesenswert?

Vielen Dank für eure Antworten und die Links.

D. h. von den 4 KBytes des ATMega644 sind 2981 Bytes (.bss) plus 620 
Bytes (.data) gleich 3601 Bytes vergeben und der Rest ist für den Stack 
(malloc() und free() werden nicht verwendet) reserviert.

von Pups (Gast)


Lesenswert?

Was muss man ins Makefile schreiben, um etwa nach dem Kompilieren 
angezeigt zu bekommen:

Flash used: xx%

von Timmo H. (masterfx)


Lesenswert?

Pups schrieb:
> Was muss man ins Makefile schreiben, um etwa nach dem Kompilieren
> angezeigt zu bekommen:
>
> Flash used: xx%
Beispiel Makefile und achte auf das "SIZE", also avr-size

von Maxi (Gast)


Lesenswert?

Timmo H. schrieb:
>> Flash used: xx%
>
> Beispiel Makefile und achte auf das "SIZE", also avr-size

Eine Berechnung, wieviel % Speicherplatz verwendet wird gibt das 
Beispiel nicht her.

von Timmo H. (masterfx)


Lesenswert?

Maxi schrieb:
> Eine Berechnung, wieviel % Speicherplatz verwendet wird gibt das
> Beispiel nicht her.
Mit etwas Eigeninitiative hättest du das schnell herausgefunden, 3 
Sekunden Google:
avr-size -C --mcu=atmega644 blubb.elf

Aber scheinbar ist das hier inzwischen zu viel verlangt.

von Maxi (Gast)


Lesenswert?

Schon klar, aber die gewünschte Ausgabe wäre z.B. 34% used 66% free.
Wie macht man das?

PS: Danke für die flinke Antwort :-)

von Timmo H. (masterfx)


Lesenswert?

Ach komm... 100-X% kann man doch im Kopf rechnen....

Device: atmega644

Program:    7842 bytes (12.0% Full)
(.text + .data + .bootloader)

Data:        198 bytes (4.8% Full)
(.data + .bss + .noinit)

Dann musst du es halt selbst parsen.

von Mini (Gast)


Lesenswert?

Timmo H. schrieb:
> Ach komm... 100-X% kann man doch im Kopf rechnen....

Schon, aber wozu selber rechnen, wenn man vor einem Rechner hockt?
Kann das ein Makefile nicht?

von Wusel D. (stefanfrings_de)


Lesenswert?

In meinem Embedded Webserver mache ich das so:

Ich versuche mit malloc() 4KB RAM zu reservieren, was logischerweise 
immer fehlschlägt. Dann versuche ich 16 bytes weniger, dann wieder 16 
Bytes weniger, usw. So oft, bis malloc nicht mehr null zurück liefert.

Dann weiß ich ungefähr, wie groß der größte verfügbare Speicherblock 
ist.

Das ist allerdings nur die halbe Wahrheit, denn es könnte auch sein, 
dass darüber hinaus noch kleinere Speicherblöcke verfügbar sind. Für 
meine Zwecke genügt allerdings diese vereinfachte Abfrage.

Umgekehrt:
Wenn ich wirklich wissen will, wieviel Speicher insgesamt frei ist, also 
ggf. auch in mehreren Stücken verteilt, fordere ich mit malloc() 
wiederholt 16 Bytes an, bis er einen null zurück liefert. Blöcke die 
kleiner als 16 bytes sind fehlen dann natürlich. Man sollte die 
Blockgröße daher passend zum Anwendungsfall wählen.

Der Haken dabei ist jedoch, dass ich den Speicher wieder freigeben muss. 
Man könnte sich die Adresse des ersten Blocks merken und die Adressen 
der nächsten Blöcke immer in den zuvor reservierten Block schreiben 
(verkettete Liste). Für einen kleinen Test mag es jedoch genügen, nach 
dem Test einfach einen Reset zu machen.

Fazit:
Überlege Dir, was Du genau mit "freier Speicher" meinst. Es könnte der 
größte verfügbare Block gemeint sein, oder die Summe aller verfügbaren 
Blöcke, oder die Summe aller Verfügbaren Blöcke mit einer bestimmten 
Größe.

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.