Hallo,
Ich habe das ALVIDI Board (V1.3) mit dem SDRAM MT48LC16M4A2.
nun lege zb.
1
volatile uint8_ data_00[512];
2
volatile uint8_ data_01[512];
3
volatile uint8_ data_02[512];
4
volatile uint8_ data_03[512];
5
volatile uint8_ data_04[512];
6
volatile uint8_ data_05[512];
7
volatile uint8_ data_06[512];
8
volatile uint8_ data_07[512];
9
volatile uint8_ data_08[512];
10
volatile uint8_ data_09[512];
11
volatile uint8_ data_10[512];
12
volatile uint8_ data_11[512];
13
volatile uint8_ data_12[512];
14
volatile uint8_ data_13[512];
15
volatile uint8_ data_14[512];
16
volatile uint8_ data_15[512];
17
volatile uint8_ data_16[512];
18
volatile uint8_ data_17[512];
19
volatile uint8_ data_18[512];
20
volatile uint8_ data_19[512];
21
volatile uint8_ data_20[512];
an und befülle die Arrays zb: data_00[i] = 'a' usw.
wenn ich die dann auslese und über Uart aus gebe habe ich immer an der
gleichen Stelle mehrere Byte Fehler.
Den EBI starte ich so:
Du schreibst nicht in das externe RAM sondern in das interne.
Das hier:
#define SDRAM_ADDR 0x4000
/*! \brief Macro to access SDRAM. */
#define SDRAM(addr) ((uint8_t *) SDRAM_ADDR)[addr]
ist die Startadresse (0x4000) für deinen externen RAM-Bereich. Deine
Arrays müssen ab diesem RAM-Bereich im Speicher liegen. Bei den
Test-Sourcen, die ich gefunden habe, schreiben die immer "zu Fuß" ins
RAM. Ist für mich unlogisch, aber anscheinend geht das nicht besser.
Grüße, Jens
Ich schau mal wo ich die Sachen habe. Vielleicht kann ich die Sachen
hochladen.
Dauert aber ein bisschen. Vielleicht heute Abend.
Bei mir habe ich das externe RAM auf dem XPLAIN Board in Betrieb
genommen und das läuft ganz gut.
Was ich aber nicht verstehe wou das Ganze gut sein soll. Wenn ich die
Werte "zu Fuß" reinschreiben muss, ist das mit jedem beliebigen
Controller möglich, oder?
Ich hatte gehofft, dass der Compiler merkt dass ich mehr Speicher habe
und kann dann das RAM dementsprechend aufteilen. Vielleicht weißß hier
ja noch jemand etwas mehr als ich.
Gruß, Jens
Also mein Wunsch wäre ja das man frei wählen kann wo man was rein
schreibt.
uint8_t xyz[100]; // liegt im internem SRAM
uint8_t abc[100] extern; // liegt im externen SRAM
somit nutzt man die schnelleren 8Kb internen SRAM
und da GCC dezeit ja nur max. 64Kb unterstützt, hat man 56Kb externen
SDRAM.
lg, markus
Im Tutorial kann ich die maximale Größe grad nicht sehen. Wo steht, dass
der Speicher begrenzt ist?
Kann man vielleicht mehr nehmen, wenn man malloc() verwendet? Ich werde
das heute Abend auf dem XPLAIN versuchen. Mit dem JTAG-Debugger müsste
ich die Werte ja sehen können. Oder ich schreibe die 8Mbyte voll und
lese die wieder aus. Ich lass mir was einfallen.
Ich hab auch im Netz noch keine vernünftigen Sourcen zum EBI gefunden.
Wie gesagt, bei mir hab ich ein Funktion, die den externen Speicher
beschreibt. Effektiv ist das nicht!
Gruß
Wie gesagt, bei mir dauert das immer ein bisschen, da ich nicht so viel
Zeit habe. Schau immer mal wieder hier rein. Ich werde die Ergebnisse
hochladen! :-)
Der Speicher auf deinem Board ist genauso groß wie auf dem XPLAIN Board.
Daher müssten die Sourcen kompatibel sein. Ab 18 Uhr bin ich zu Hause
und kann das bei mir mal testen. Die Ergebnisse werde ich dann hier
hochladen. Ich bin mir sicher, dass das nicht nur für uns zwei
interessant ist!
Also ich bin einen Schritt weiter:
Ich habe das exteren SDRAM am Laufen, aber du hast Recht: Man kann nur
49kByte benutzen. Dafür kannst du aber das Ram so einbinden wie du das
wolltest. Du kannst einfach in das Array schreiben und es wird
automatisch im externen RAM angelegt. Schau dir das mal an. Vielleicht
kannst du das direkt laufen lassen.
Jetzt muss man nur noch rausbekommen, warum die Größe limitiert ist. Das
ist sehr unschön! Ich brauche mehr Platz.
Wenn man mit einer Funktion ins RAM schreibt geht mehr. Das habe ich
schon getestet. Da gehen wirklich die 8MByte. Aber halt langsamer.
Ich hänge das Projekt an!
Ich hab es:
Im Datenblatt auf Seite 22 steht, das das interne SRAM auf Adresse
0x2000 los geht.
Enn man mehr als 64kByte haben will, muss man die Adressierung selber
machen und einen 32bit Pointer anlegen. In den Tutorials von Atmel ist
da was drin. Aber wie gut das geht weiss ich noch nicht.
Ich habe hier im Forum eine Bibliothek gefunden (himem.h). Die macht
genau das. Die verwendet nicht nur die RAMPX und RAMPY Pointer, sondern
auch den RAMPZ Pointer. Ich hab die noch nicht implementiert. Aber
vielleicht hast du heute noch Muse das zu tun. Ich schaff das heute
wahrscheinlich nicht mehr.
Ansonsten ab morgen mehr. Ob ich am Wochenende dazu komme weiss ich
nicht. Du müsstest genau sagen, was du brauchst. Dann kann ich morgen
vielleicht mal einen Studenten in der Firma dran setzten!
Grüße und schönen Abend, Jens
Hallo Jens,
das es "normal" mit dem GCC nur bis 64kB geht ist mir klar.
Dem Linker sage ich folgendes:
1
#---------------- Linker Options ----------------
2
# -Wl,...: tell GCC to pass this to linker.
3
# -Map: create map file
4
# --cref: add cross reference to map file
5
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
6
LDFLAGS += $(EXTMEMOPTS)
7
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
8
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
9
#LDFLAGS += -T linker_script.x
10
LDFLAGS += -Wl,-section-start=.data=0x804000
11
LDFLAGS += -Wl,-defsym=__heap_end=0x80ffff
Bei dieser Einstellung habe ich ja 49kB zuverfügung.
der interne geht bei 0x2000 los, der externe bei 0x4000
0xFFFF - 0x2000 = 57kB. Da fehlen doch aber noch 8kB
lg, markus
Schau mal ins Datenblatt rein!
Von 0x0000 - 0x1FFF sind die ganzen Register
0x2000 - 0x3FFF internes SRAM
0x4000 - 0xFFFFFF externes RAM
Der Atmel hat eine durchgehende Adressmap für alle Speicher und
Register.
Mit den 49kB geht das genau auf.
Deine Linker Optionen muss ich zugeben, die sagen mir überhaut nichts.
Damit hatte ich bis jetzt noch nichts zu tun.
Ich lade morgen nochmal den anderen Code hoch, der den Speicher bis
8MByte unterstützt. Da müssten wir uns mal Gedanken machen, ob man den
inline einfügt und wir müssten testen, ob das die Performance steigert.
Der Mittelweg ist dann der Richtige. Nämlich Laufzeit und
Speicherbelastung.
Gruß, Jens
Ich habe nochmal etwas getestet, ziehe ich meinen CS Jumper für den
externen RAM, dann wird kein Array mehr angelegt was bedeutet das der
interne Speicher nicht angesprochen wird.
lg, markus
Das glaube ich nicht. Kannst du den Code mal posten?
Das CS geht doch nur auf den externen SRAM. Du könntest auch mal
beschreiben, was du vor hast. Dann kann man die SOurcen gleich so
trimmen, das das passt.
Gruß, Jens