Hallo Leute,
Ich steh hier vor einem Problem, bei dem ich nicht weiter komm.
Ich habe hier ein Programm für einen XMega192A3 (16k SRAM) und möchte es
in einen XMega128A1 (8k SRAM) portieren. Jetzt reicht der interne RAM
Speicher des XMega128 leider nicht aus.
Ich habe allerdings SDRAM am XMega dran hängen und möchte dass der
AVR-GCC all meine Variablen dorthin speichert.
Die Variablen sind fast alle in einem Struckt angelegt wie z.B. so hier:
1
structcontrollerSingleton{// main TG controller struct
2
uint16_tmagic_start;// magic number to test memory integity
3
doublenull;// dumping ground for items with no target
4
uint8_ttest;
5
uint8_tsrc;// active source device
6
uint8_tdefault_src;// default source device
7
uint8_tlinelen;// length of currently processing line
8
uint8_tled_state;// 0=off, 1=on
9
int32_tled_counter;// a convenience for flashing an LED
10
charin_buf[INPUT_BUFFER_LEN];// input text buffer
11
charout_buf[OUTPUT_BUFFER_LEN];// output text buffer
12
charsaved_buf[SAVED_BUFFER_LEN];// save the input buffer
13
uint16_tmagic_end;
14
};
Interner SRAM: 0x2000 - 0x3FFF ( soll nur für den Stack bleiben)
Externer SDRAM: 0x4000 - 0xFFFF ( für alle angelegten Variablen und
Heap)
Reicht es im Makefile sowas wie hier
avr-gcc ...
-Wl,--section-start,.data=0x804000,--defsym=__heap_end=0x80ffff
zu schreiben, oder muss ich noch mehr beachten und was hat es mit dem
"malloc()" auf sich?
Den SDRAM muss ich natürlich auch noch initialisieren. In ASM war das
für mich kein Problem und ich habe damit den SDRAM auch schon testen
können.
Ich bin blutiger "C" Anfänger..
Gruß Steffen
Von XMEGAs habe ich keine Ahnung aber da es wohl derselbe Compiler ist
wird es wohl ähnlich gehen wie bei meinem ATMega2560 mit externem SRAM
Ich habe 2 Linker-Symbole definiert
--defsym=__heap_start=0x802200,--defsym=__heap_end=0x80ffff
und dann muss auch noch sehr früh das Interface fürs externe RAM
aktiviert werden.
Danke für die Antwort
M. K. schrieb:> Ich habe 2 Linker-Symbole definiert> --defsym=__heap_start=0x802200,--defsym=__heap_end=0x80ffff
Also reicht es eventuell schon, dem Linker zu sagen wo meine
SRAM-Section beginnt und endet?
Und was hat es denn jetzt mit diesem *malloc()* auf sich?
Bin gerade dran das EBI im SDRAM - Mode zu initialisieren. Mal sehen ob
das klappt.
Gruß Steffen
Steffen H. schrieb:> Und was hat es denn jetzt mit diesem *malloc()* auf sich?
Was ist jetzt genau deine Frage?
Also malloc() reserviert einen Speicherblock auf dem Heap.
Wenn du das ganze ein wenig debuggen möchtest, kannst du dir noch Zeiger
auf den Anfang-/Ende des Heaps besorgen. Ausserdem gibt es noch einen
Zeiger auf die aktuelle Größe des Heaps.
1
externchar*__malloc_heap_start,*__brkval,*__malloc_heap_end;// Variablen für den heap
Steffen H. schrieb:> Also reicht es eventuell schon, dem Linker zu sagen wo meine> SRAM-Section beginnt und endet?
Nein, was M.K. da gepostet hat, verlegt nur den Heap in das externe RAM,
nicht aber die Variablen. Deine Variante war schon richtig.
Steffen H. schrieb:> Und was hat es denn jetzt mit diesem malloc() auf sich?
Damit holt man sich dynamisch Speicher vom Heap.
Wenn du kein malloc() benutzt, dann brauchst du dich um Dinge wie
__heap_end auch nicht kümmern. Es reicht dann völlig, .data auf
den Anfang des externen SDRAM zu setzen (der Stack wird ja ohnehin
auf das obere Ende des internen SRAM initialisiert).
Allerdings musst du dich natürlich drum kümmern, dass das XMEM-
Interface frühzeitig genug initialisiert wird, so wie das oben
schon mit der entsprechenden Funktion in .init1 angedeutet war.
Steffen H. schrieb:> In ASM war das> alles viel einfacher..
Ja dan bleib doch bei ASM... immer dieses 'genörgel' das mit XYZ 'alles
einfacher war'... Wie einfach war das den als du gerade mit ASM
angefangen hast?
Deine ganzen lid/sti orgine kannst du nun durch einfache Zuweisung
lösen, Rücksprünge mit Abbruchbedingung durch eine while Schleife, was
ist daran bitte "komplizierter"?
Und wenn du unbedingt darauf bestehst das ASM einfacher ist, du kannst
ja auch in C ASM Code einbinden, oder sogar ganze ASM Module schreiben
und einbinden...
Ob das aber einfacher ist als sich mal mit den Grundlagen zu
beschäftigen...?
Läubi .. schrieb:>> In ASM war das>> alles viel einfacher..>> Ja dan bleib doch bei ASM... immer dieses 'genörgel' das mit XYZ 'alles> einfacher war'... Wie einfach war das den als du gerade mit ASM> angefangen hast?
;-)
Um mal zu zeigen, dass das in C wirklich nicht schlimmer ist:
Ist also eigentlich alles dasselbe, außer dass man eine Zuweisung auch
über mehrere Zeilen schreiben kann, dass man sich keine „Akkus“ selbst
definieren muss, und dass man sich nicht um die Aufteilung der
16-bit-Register in high- und low-Bytes kümmern muss. ;-)
Ich habe es spaßeshalber für dich durch den Compiler geschoben um zu
sehen, ob es auch compiliert. EBI_CS_ASPACE_16M_gc hat dem Compiler
nicht gefallen, da die Konstante offenbar EBI_CS_ASIZE_16M_gc heißt.
Hat dein Assemblercode wirklich so funktioniert?
(Ob das Ganze inhaltlich auch Sinn hat, weißt du natürlich nur selbst,
ich habe lediglich stupide deine Assemblerwust in C-Wust übertragen.)