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
> 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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.