AVR-XRAM vom C-Compiler verwalten lassen
Hallo Gemeinde,
seit einiger Zeit versuche ich einem ATmega162 externes RAM (XRAM-Interface, 32kB SRAM) anzuflanschen. Die Hardware funktioniert 100%. Das Problem ist die Software, genauer gcc-avr (winAVR).
Also: das XRAM-Interface wird eingeschaltet (section .init1), dann wird per Zeiger direkt ein Bitmuster im externen RAM aufgebaut. Danach wird dieses Muster (wieder per Zeiger) aus dem RAM gelesen und in ein LCD kopiert - daher weiß ich auch, daß das alles sauber arbeitet. Der Quellcode dürfte daher uninteressant sein.
Was nicht mitspielt - und ich habe nach tagelanger Recherche nichts hilfreiches zum Thema gefunden:
Dem Compiler mitteilen, daß er jetzt über erheblich mehr Speicher herrschen darf.
Laut Win-AVR Doku müßte es mit einem Eintrag im Makefile erledigt sein:
Zitat:
avr-gcc ... -Wl,-Tdata=0x800500,--defsym=__heap_end=0x80ffff ...
Leider ist es sowohl dem Compiler als auch dem Linker wurstegal, was ich da hineintippe. Auch ein zusätzliches:
Zitat:
-minit-stack=0x800500
(testweise auch mal auf 0x200) brachte nichts. Der Stacktop liegt grundsätzlich bei 0x4ff und wird durch jede größere Variablen-Deklaration nach unten verschoben. Das führt bei entsprechend vielen Variablen (oder großem Array!) dazu, daß der Stacktop auf 0x0000 oder kleiner (!!!) verbastelt wird et voilà die Maschine geht beim ersten RET in den Wald. Aber davon abgesehen liegt der Stacktop nicht wie erwartet und die anderen Code-Segmente auch nicht da, wo die Doku verspricht (siehe hier http://www.nongnu.org/avr-libc/user-...ml#faq_ext_ram und hier http://www.nongnu.org/avr-libc/user-...l#malloc_where).
Zwei verschiedene Makefile-Templates habe ich jetzt auch durch, das gleiche schlechte Ergebnis.
Also die Frage: Wie bekomme ich den AVR-GCC dazu dem Stack das komplette interne RAM zu geben und den Rest ins externe RAM zu verlagern und dieses damit vom Compiler verwalten lassen?
Ich hoffe es liegt an mir und nicht an einem massiven Bug im winAvr, nur finde ich den Fehler nicht.
Gruß H.A.R.R.Y.