Forum: Mikrocontroller und Digitale Elektronik 8051: externer RAM, Absturz (FX2LP)


von pumpkin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich arbeite gerade an einem Cypress FX2LP. Ein USB Baustein mit 
integriertem 8051 Derivat. Als Grundstock habe ich ein Beispiel von 
Cypress genommen und fleißig angebaut, was bis gestern auch prima 
funktionierte. Nun habe ich ein c-File mit einer ziemlich großen 
Font-Definition eingebunden (~2kByte, GLCD). Deklariert habe ich die 
GLCD-Tabellen folgendermaßen (auf das Schlüsselwort 'const' wie es im 
originalen GLCD-Code verwendet wird habe ich erstmal verzichtet):
1
unsigned int xdata

Im GLCD struct habe ich folgende Definition:
1
typedef xdata struct
2
{
3
   unsigned int glyph_width;
4
   unsigned int glyph_height;
5
   unsigned char xdata* glyph_table;
6
   unsigned char xdata* mapping_table;
7
   unsigned char xdata* width_table;
8
   unsigned int xdata* offset_table;
9
}LCD_FONT;

Ich habe auch schon vorher andere structs so im externen RAM angelegt. 
Die Speichereinstellungen im Keil µVision habe ich als Bild angehängt.

Wenn ich das Programm nun runterlade passiert nichts oder der Cypress 
rebootet ständig. Das M51 Listing habe ich mir schon angeschaut, das 
sieht imho so aus wie es soll.

Hat jemand eine Idee?

von pumpkin (Gast)


Angehängte Dateien:

Lesenswert?

Nachdem ich nochmal alles abgeklopft hatte bin ich drauf gestoßen. 'Use 
Memory Layout from Target Dialog' abwählen und Bereich neu eintragen. 
Obwohl ich im 'Target Dialog' den selben Bereich angegeben hatte hat es 
nicht funktioniert?!?
Ist hier ein Keil-Spezi der das kurz erläutern kann, das würde mich 
interessieren?

von Matthias (Gast)


Lesenswert?

Hast Du wirklich zusätzlich zum internen XDATA einen externen RAM von 
16k im Bereich von 0-3FFF wie angegeben? Kuck nochmal was bei Reiter 
BL51... eingestellt ist.

>unsigned int xdata
XDATA ist bei Keil ein reserviertes Schlüsselwort

Wenn Du Tabellen/Fonts etc. im Flash als Festwert ablegen willst, dann 
benutze CODE, wie hier:
1
byte CODE font5x7[] = {
2
     0x00, 0x00, 0x00, 0x00, 0x00,
3
     0x20, 0x55, 0x54, 0x55, 0x78,
4
     0x3C, 0x41, 0x40, 0x21, 0x7C,
5
     0x38, 0x45, 0x44, 0x45, 0x38 // u.s.w.
6
}

von pumpkin (Gast)


Angehängte Dateien:

Lesenswert?

Ein externer ist nicht dran, aber da der FX2 einen on-chip RAM hat der 
sich wie externer verhält dachte ich, dass das Sinn macht. Dass xdata 
ein reserviertes Schlüsselwort ist, ist ja quasi das Ziel der Sache. Da 
dieser Font nicht in die DATA-Region passt muss man es ja auf XDATA 
(oder wie bei dir auf CODE) auslagern. Da Programm- und Datenspeicher im 
selben Abschnitt liegen, sich also die 16k teilen, habe ich diese Angabe 
mit XDATA 0x0000 bis 0x3FFF gemacht. Denkfehler?

Der Zugriff auf CODE und XDATA geschehen ja über MOVC respektive über 
MOVX. MOVC kann schneller sein, muss aber nicht. Gibt es sonst einen 
guten Grund den Font als CODE zu deklarieren?

von Matthias (Gast)


Lesenswert?

>Da dieser Font nicht in die DATA-Region passt muss man es ja auf XDATA
>(oder wie bei dir auf CODE) auslagern. Da Programm- und Datenspeicher im
>selben Abschnitt liegen, sich also die 16k teilen, habe ich diese Angabe
>mit XDATA 0x0000 bis 0x3FFF gemacht. Denkfehler?

Ja, grundsätzlich falsch (8051 ist keine "Neumann Architektur"!!!)

Warum willst Du den Font in den RAM legen? Der ändert sich doch während 
der Laufzeit nicht, daher leg ihn einfach im CODE-Bereich ab.

Die Angabe bei "Off Chip XDATA Memory" muß weg, dann
"Use Memory Layout from Target Dialog" bei BL51 anhaken und dort auch 
die Angabe XDATA-Range löschen. Dann sind ersmal die Grundeinstellungen 
ok.

>Dass xdata ein reserviertes Schlüsselwort ist, ist ja quasi das Ziel der >Sache.

Nach Deiner ursprünglichen Deklaration; woher soll der Linker wissen, 
dass das in XDATA soll? Geht so nicht.

Allgemein:
XDATA unsigned char my_variable; // Variable in XDATA im Small-Modell

Matthias

von pumpkin (Gast)


Lesenswert?

> Ja, grundsätzlich falsch (8051 ist keine "Neumann Architektur"!!!)

Ist mir ja klar, aber im Datenblatt steht halt dass es geshared ist.


> Warum willst Du den Font in den RAM legen? Der ändert sich doch während
> der Laufzeit nicht, daher leg ihn einfach im CODE-Bereich ab.

Kein besonderer Grund, deswegen frage ich ja. Ich leg ihn in den 
Datenspeicher und deklariere ihn als konstant (const). Ist imho 
konsistenter.


> Die Angabe bei "Off Chip XDATA Memory" muß weg, dann
> "Use Memory Layout from Target Dialog" bei BL51 anhaken und dort auch
> die Angabe XDATA-Range löschen. Dann sind ersmal die Grundeinstellungen
> ok.

Wenn ich es so mache kompiliert er nicht, der Linker kommt dann garnicht 
mehr klar.

Ich habe jetzt die Ranges auf der LB51 Karte eingetragen. Use onchip ROm 
abgehakt, small model, ROM large. Dann passts.


> Nach Deiner ursprünglichen Deklaration; woher soll der Linker wissen,
> dass das in XDATA soll? Geht so nicht.

Reden wir aneinander vorbei? Sie erster Post. "unsigned int xdata", ich 
hoffe du dachtest nicht, dass 'xdata' mein Variablenname ist. Das ist er 
natürlich nicht!

von Matthias (Gast)


Lesenswert?

>Nun habe ich ein c-File mit einer ziemlich großen
>Font-Definition eingebunden (~2kByte, GLCD).

Wie soll das in den internen XRAM (0.5k) passen?

> Warum willst Du den Font in den RAM legen? Der ändert sich doch während
> der Laufzeit nicht, daher leg ihn einfach im CODE-Bereich ab.

>Kein besonderer Grund, deswegen frage ich ja. Ich leg ihn in den
>Datenspeicher und deklariere ihn als konstant (const). Ist imho
>konsistenter.

Wenn genug RAM da wäre, ok, aber bei µC muss man mit RAM haushalten und 
solche Daten in den CODE zu packen ist gängig.

von pumpkin (Gast)


Lesenswert?

1
const unsigned char xdata Verdana__8_mapping_table[] = ...

So habe ich es von Anfang an gehabt. Und deswegen passt das in den 
internen 16k großen XDATA-(Datenspeicher)-Bereich.
1
The FX2LP has 16 KBytes of internal program/data RAM,
2
where PSEN#/RD# signals are internally ORed to allow the
3
8051 to access it as both program and data memory. No USB
4
control registers appear in this space.

Verstehe ich das nun falsch oder teilen Code und Daten sich diesen einen 
(!) Speicher?

von Matthias (Gast)


Lesenswert?

Kuck mal was im .lst File für eine Speicherbelegung steht.

Genaueres zur Linkung steht im .m51 File.

Wie bekommst Du das Prog. in den µC? Habe mal das Datenblatt grob 
überflogen. Das Teil hat nur den RAM als Speicher. Wenn Du den für CODE 
und XDATA gemeinsam nutzen willst, würde ich die Bereiche Adressenmäßig 
trennen. Einige Aussagen von mir vorher passen nicht.

z.B.
"Use Onchip-ROM" deaktivieren
Offchip Memory Eprom: 0x0000 Size 0x2FFF (12k)

Offchip Xdata Memory: 0x3000 Size 0x0FFF (4k)
oder je nach dem was Du brauchst.

und "Use on-Chip XRAM" versuchsweise deaktivieren

Matthias

von pumpkin (Gast)


Lesenswert?

Richtig. Das habe ich auch rausgefunden direkt nach meinem letzten Post. 
Um mein Gehirnknoten zu lösen habe ich das 'alte' FX2 Manual hergenommen 
wo es astrein beschrieben steht. (Es funktioniert übrigens auch mit XRAM 
enabled.) Einen halben Tag Konfusion - nicht gut wenn man von den AVR's 
verwöhnt ist  ;^)

Trotzdem vielen Dank für deine Mühe!

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