malloc error bei vielen finals

0 views
Skip to first unread message

Burkhart Holznagel

unread,
Sep 30, 2011, 8:21:06 AM9/30/11
to bajo...@googlegroups.com
hallo christopher und gunter:
hier eine erklärung für den malloc-error bei vielen finals im arduino.
ich hoffe,
das verwirrt nicht zu sehr, was ich da geschreiben habe.

für jede klasse wird im ram eine classFile-Struktur angelegt (beim
arduino mit malloc) und speicher für:
ca: 40 bytes + 2*(anzahl der constanpooleinträge)+2* (anzahl der
fields) + 2*(anzahl der methods) (zeiger zu fields und methods)
allokiert
bei 20 klassen sind das mindestens erstmal 800 bytes

dann in limits.h
2k bytes für den heap
und
256 bytes für jeden opstack (pro thread ein stack)
96 bytes für einen methodstack
also mindesten 800 + 2000 + 256 + 96 ~ > 3K
für die 240 final fields und die 240 namenseinträge im constantpool
kommen noch 2*480 bytes hinzu
das sind dann insgesamt 4K
dann braucht bajvm platz für den c-stack und lokale variable.
aus limits.h:
#ifdef AVR8
#define MAXCLASSES 20
#define MAXBYTECODE 0x5000 //!!! class file bytes in flash!!
#ifdef AM
#define MAXHEAP 0x200 // u4 entries
for heap-elements
#define MAXHEAPOBJECTLENGTH 0x40
#define MAXTHREADS 4
#define MAXLOCKEDTHREADOBJECTS 16
#define OPSTACKSIZE 64 // u4
#define METHODSTACKSIZE 48 // u2
#define MAXNATIVEMETHODS 40
#endif

normales java programm ohne viele finals:
Bajos starting
SP: 21fc cs: 4f0 cFB: 0 hB: 8e6 oPSB: 1b53 mSB: 1c55
mit 40 finals:
Bajos starting
SP: 21fc cs: 4f0 cFB: 0 hB: 8e6 oPSB: 1c4f mSB: 1d51

der c-stack wächst nach unten von 0x2200
von 200 - 4f0 sind (noch wenige) c-strings und die globalen variablen
die class-structuren liegen bei 4f0 bis 8e6
der heap geht von 8e6 bis 10e6 (2k)
die allokierten bereiche für pointer auf constantpool-eintraege,
fields und methods
liegen dahinter-> hier sieht man, daß die 40 finals ungefähr 256 bytes belegen
(1c4f - 1b53)
wenn noch wesentlich mehr finals sind, überschreibt man den stack und kommt
über 2200 (8k ram in atmega1280).
wenn man mehrere threads hat werden für jeden ein opStack und ein
methodStack angelegt, das wird dann auch knapp beim arduino.

man kann nur in limits.h am heap und an den stacks einsparen, wenn man viele
threads und sehr viele finals realisieren will.

grüße burkhart

Reply all
Reply to author
Forward
0 new messages