ATMega644-Programm: Wieviel SRAM ist noch frei?

Gast #3093266
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
#3093282
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
Gast #3093303
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.
#3095817
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren