Forum: Compiler & IDEs Speicher/Array deklarieren


von Christian Rattat (Gast)


Lesenswert?

Hallo,

ich hab folgendes Problem: Ich hab einen ATMega 128 und eine
Applikation, die einiges an Daten aus einem externen Speicher (1MB)
zieht. Die Daten möchte ich in Arrays ablegen. Das funktioniert auch
soweit ganz gut. Nur scheinen meine Arraydeklaration nun den
verfügbaren Speicher zu überschreiten.

Scheinbar werden die Arrays im .bss Segment angelegt und das wiederum
scheint mir nur 32Kb fassen zu können. Kann ich das irgendwie umgehen
und das Zeugs im Daten- oder Textsegment ablegen? Oder kann man das
.bss Segment vergrößern?

Ich hab auch was von extmem hier im Forum gelesen hab aber keine Ahnung
ob das für mich relevant ist. Hab leider keine Ahnung, wie das
zusätzliche RAM angebunden ist (ist eine fertige Hardware, die ich
programmieren soll).

Grüße,
Christian

Hier noch der Linker output:

ac_main.elf  :
section    size      addr
.data         0   8392960
.text     15978         0
.bss      28175   8392960
.noinit       0   8421135
.eeprom       0   8454144
Total     44153

von Christian Rattat (Gast)


Lesenswert?

p.s. Wie bekomme ich eigentlich heraus, wie groß die Segmente sind?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Scheinbar werden die Arrays im .bss Segment angelegt und das
> wiederum scheint mir nur 32Kb fassen zu können.

Nein, kann es nicht.  Aber: ein Array-Index ist ein `int', damit
lassen sich nur (Vorzeichen!) 32K-1 Elemente adressieren.  Wenn du in
einem Array Bytes verarbeiten willst, kannst du daher nur 32K-1 Bytes
in einem Array haben.

von Christian Rattat (Gast)


Lesenswert?

Hm, ich glaube, ich habe mich falsch augedrückt :-)

Meine Arrays selbst sind jeweils deutlich kleiner als 32KB. Ich habe
insgesamt 3 Arrays, die jeweils 7, 4, und 17KB belegen. das 7KB Array
kann ich aber nicht anlegen, da dann die Applikation nicht mehr
funktioniert. Mache ich das 4K groß, geht wieder alles. Das Array wird
aber bisher nirgends verwendet nur deklariert.

Das korreliert auffälig damit, dass die Größe des .bss Segments sich
der 32K Grenze nähert. Dieses Verhalten habe ich auch vorher schon
beobachten können.

von Christian Rattat (Gast)


Lesenswert?

Und noch eine Frage:

Ich habe mal das eine Array weggelassen, so dass die App funkioniert.

Ich hab nun eins der anderen Arrays, das so deklariert war:

unsigned char buffer[16000];

Dieses habe ich mit Daten befüllt, die aus dem externen Flashram
kommen. Das hat auch wunderbar funktioniert. Nun hatte ich die Idee,
dass ich den dazu verwendeten Speicher einfach mit malloc besorge, was
so aussieht:

unsigned char* buffer;
...
buffer = malloc(16000);

Kopiere ich aber die Daten in den Puffer, schmiert mir alles ab. Was
mache ich da schon wieder falsch?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du wirst das wohl oder übel debuggen müssen, statt zu
rätselraten.

von Christian Rattat (Gast)


Lesenswert?

Ich hab mal folgendes getan:

Die standard EXTMEM Optionen im Makefile definieren den Heapbereich mit
einer Größe von genau 0x7fff bytes. Habe nun die Größe für data von
0x1100 auf 0x0900 verkleinert und damit funktioniert es.

D.h. der Heap ist also definitiv 32k groß, was mein Probkem erklärt.
Die Frage ist nun, warum das Ändern von __heap_end von 0x90ff auf
0xffff nicht funktioniert, wohl aber das verkleinern von data und damit
automatisch das vergrößern des Heaps. Ich wüsste nich, wie ich das
debuggen sollte?

Irgendeine Idee dazu?

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.