PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Max Arraygröße bzw Grenzen des Atmega



Unregistriert
22.10.2015, 08:02
Hallo zusammen,

als Speicher gibt es ja den Flash (für das Programm), EPROM und RAM (Variablen?).

Wie groß kann ein Array vom Typ INT maximal sein bei dem Atmega 2560:
Flash: 256 kB
EPROM: 4 kB
RAM: 8 kB

Theoretisch sollten es doch [4000] stllen haben dürfen, bei 8kB Ram, da INT ja 2Byte groß ist oder?


Danke schonmal vorab

oberallgeier
22.10.2015, 08:22
.. Theoretisch sollten es doch [4000] stllen haben dürfen, bei 8kB Ram, da INT ja 2Byte groß ist oder? ..4000 STELLEN ?? Also bei mir hat ein Byte als dekadische Ziffer schon mal bis zu drei Stellen. Rund 4000 Bytes wäre richtiger. Das ist ein theoretischer Wert, weil das als Nur-Speicher ja davon ausgehen müsste, dass ein evtl. vorhandenes Programm keinen dynamischen Speicher belegt. Und letzteres kommt ja äusserst selten vor :-/

Ich habe z.B. schon Felder der Art MEIN-QFELD [25][25] untergebracht. Da ist es ziemlich praktisch beim Kompilieren im AVRStudio (mein Standard) die aktuelle Speichernutzung byte- und prozentmässig aufgelistet zu bekommen.

Build started 22.10.2015 at 09:28:40
avr-gcc -I"D:\D_pro-fils\compu_MC\C5_Ronny-5_etc\MoCo4\..\..
...
avr-objdump -h -S MoCo4.elf > MoCo4.lss

AVR Memory Usage
----------------
Device: atmega1284p

Program: 17912 bytes (13.7% Full)
(.text + .data + .bootloader)

Data: 2434 bytes (14.9% Full)
(.data + .bss + .noinit)


Build succeeded with 0 Warnings...

sternst
22.10.2015, 09:02
4000 STELLEN ?? Also bei mir hat ein Byte als dekadische Ziffer schon mal bis zu drei Stellen. Rund 4000 Bytes wäre richtiger.Nö, 4000 Elemente wäre richtiger (übrigens 8000 Byte in diesem Fall).



Das ist ein theoretischer Wert, weil das als Nur-Speicher ja davon ausgehen müsste, dass ein evtl. vorhandenes Programm keinen dynamischen Speicher belegt.Nö, es wären ja noch 192 Bytes frei.

Klebwax
22.10.2015, 11:20
Hallo zusammen,

als Speicher gibt es ja den Flash (für das Programm), EPROM und RAM (Variablen?).

Wie groß kann ein Array vom Typ INT maximal sein bei dem Atmega 2560:
Flash: 256 kB
EPROM: 4 kB
RAM: 8 kB

Hier gehts ja wohl um C. Da kann das EEPROM außen vor bleiben, da C soetwas nicht kennt (das wird eher wie ein externer Massenspeicher angesprochen). Das Flash ist für Code und konstante Daten. Bleiben also die 8k RAM. Dort müssen alle Variable, globale und lokale, sowie der Stack hineinpassen. Je nach Programmgröße und Programmierstil sollte man für Stack und lokale Variable 25% bis 50% reservieren. Dann bleiben noch 4k. Ein int in C ist mindestens 16 Bit, also 2 Byte groß. Es ist also Platz für rund 2000 ints. Sind ints 32 Bit werdens nur 1000.

Man muß aber immer aufpassen, daß einem der Stack nicht in die Variablen läuft.

MfG Klebwax

xrzr
23.10.2015, 06:01
@Klebwax: genau das habe ich gemeint. So war auch mein Ansatz, außer das ich das mit den 25% bzw 50% nicht wusste.

Danke

Peter(TOO)
23.10.2015, 11:40
Hallo,

@Klebwax: genau das habe ich gemeint. So war auch mein Ansatz, außer das ich das mit den 25% bzw 50% nicht wusste.

Sorry, aber so eine absolute %Angabe ist Humbug.
Wenn ich ein Programm auf einem Chip mit 2K Ram entwickle und dann auf einem identischen Chip mit 8K laufen lassen vierteln sich die Prozente, weil sich sonst rein gar nichts ändert.

Die Stackgrösse ist tatsächlich nicht einfach abzuschätzen, denn sie hängt von vielem ab.
Rein von der Hardware her, braucht jeder Interrupt etwas Stack um die Register zu retten. Hier muss man beachten wie viele Interrupts maximal verschachtelt sein können.
Beim eigentlichen C-Programm kommt dann für jeden Funktionsaufruf Platz für die Parameter der aufgerufenen Funktion, zu rettende Register und lokale automatische Variablen hinzu. Auch hier muss man an die Schachtelung denken. Hier kommt dann auch der Programmierstil hinzu. Es macht einen grossen Unterschied ob ich in einer Funktion lokal 100 Byte für einen Buffer anlege oder nur einen Zeiger auf einen globalen Buffer übergebe.

Aufpassen muss man auch immer mit den verwendeten Bibliotheken, die benötigen auch Platz auf dem Stack, es ist aber nicht immer einfach, heraus zu bekommen wie viel.

Vor 20 Jahren hatten viele Controller nur 128 oder 256 Byte RAM und diese konnte man auch schon gut mit C programmieren.

MfG Peter(TOO)