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
unsignedintxdata
Im GLCD struct habe ich folgende Definition:
1
typedefxdatastruct
2
{
3
unsignedintglyph_width;
4
unsignedintglyph_height;
5
unsignedcharxdata*glyph_table;
6
unsignedcharxdata*mapping_table;
7
unsignedcharxdata*width_table;
8
unsignedintxdata*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?
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?
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:
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?
>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
> 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!
>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.
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
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!