mikrocontroller.net

Forum: Compiler & IDEs Speicher/Array deklarieren


Autor: Christian Rattat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian Rattat (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Rattat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Rattat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Christian Rattat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.