Forum: Mikrocontroller und Digitale Elektronik XDATA Problem auf Silabs C8051F41x und Keil uv3


von cidex (Gast)


Lesenswert?

Hallo,
habe ein ähnliches Problem mit dem XDATA Speicherbereich wie einige 
andere hier (allerdings konnte ich die Antwort auf alle meine Fragen 
noch in keinem anderen Thread finden)

Zum Silabs C8051F41x:
256 bytes internen RAM  (0x00 bis 0xFF)
untere 128 bytes sind direkt und indirekt adressierbar
0x00 bis 0x1F sind 4 bänke von General Purpose Registern, jew. 8byte 
breit.
Die nachfolgenden 16 bytes, von 0x20 bis 0x2F, sind byte und bit direkt 
adressierbar.
Die nachfolgenden 128bytes (ab 0x80) sind nur indirekt adressierbar 
nimmt den selben Bereich ein wie die SFRs aber ist physikalisch von 
ihnen getrennt. Wobei durch die art der adressierung unterschieden wird 
welcher physikalische speicherbereich ausgewählt wird. (direkt -> SFRs, 
indirekt->Speicher)
Zusätzlich stehen 2048 bytes on-chip RAM zur verfügung die auf den 
externen (xdata) speicherbereich gemappt sind.


In meinem Programm werden global zwei Arrays angelegt:
unsigned char RF_Data[18];
unsigned char Data[18];

später werden die Daten in einer funktion manipuliert.
MemoryModel: small(var in Data) Code Rom Size Large(64K Programm)
So funktioniert das Programm.

Wenn ich nun das Data array in xdata lege:
unsigned char RF_Data[18];
unsigned char xdata Data[18];

unabhängig von der Reihenfolge, also auch:
unsigned char xdata Data[18];
unsigned char RF_Data[18];

funktioniert das Programm nicht mehr. Es ist unabhängig von RF_data, das 
kann ich problemlos in xdata legen solange das Data Array nicht dort 
liegt (unabhängig von der Reihenfolge in der ich die C codezeilen 
schreibe).

Ich kann das programm zum funktionieren bringen in dem ich den code in 
dem das RF_Data Array beschrieben wird auskommentiere.
Die Codestellen in denen in Data geschrieben wird oder aus RF_Data 
gelesen führen zu keinem Fehler.

Was meine ich mit NICHT FUNKTIONIEREN:
Beim beginn des debuggen beginnt das Programm nach dem reset zu laufen 
und hört nicht mehr auf, es kommt nie an Haltepunkten vorbei die ich im 
Programm setzte. -> Ich überschreibe vermutlich den Reset Vektor

->Aber wie mache ich das, was passiert da genau?

Wie mappe ich den Speicher richtig in Keil uv3? Sollte das nicht beim 
angeben der uC type automatisch feststehen wo welcher speicher liegt?

von AndreB (Gast)


Lesenswert?

Moin.

Als ersten würde ich den Buffer Data in was anderes umbenennen, das ist 
nämlich ein reserviertes Wort.

Als nächstes hast du small Model angegeben(Var in Data), wenn die 
Variablen in Data liegen sollen kannst du sie nicht in XData anlegen.
IMHO heist data hier == idata.

Andre

von Peter D. (peda)


Lesenswert?

AndreB schrieb:
> Als nächstes hast du small Model angegeben(Var in Data), wenn die
> Variablen in Data liegen sollen kannst du sie nicht in XData anlegen.

Doch kann man.
Das Modell gilt nur für Variablen ohne Specifier und die Libraries.

In jedem Modell lassen sich alle Bereiche benutzen, wenn man den 
Specifier angibt (data, bdata, idata, code, pdata, xdata).


Wichtig ist aber, vor Nutzung des pdata/xdata, diesen zu enablen und 
auch dem Linker zu sagen, wo er beginnt, wenn nicht bei 0x0000.


Peter

von cidex (Gast)


Lesenswert?

>Wichtig ist aber, vor Nutzung des pdata/xdata, diesen zu enablen und
>auch dem Linker zu sagen, wo er beginnt, wenn nicht bei 0x0000.

nun hier ist mein problem, wie schalt ich ihn frei? Keil bietet mir die 
möglichkeit internen XDATA zu verwenden (in ner checkbox)


Werd als erstes mal den Variablen namen von Data ändern.

von cidex (Gast)


Lesenswert?

Die Änderung des Variablennamnes hat nichts am obigen Problem geändert.

Mir ist gerad aufgefallen dass wenn ich RF_Data in xdata stelle auch 
programmfehler auftreten, allerdings erst später, hier werden vermutlich 
andere routinen überschrieben.

von cidex (Gast)


Angehängte Dateien:

Lesenswert?

Bin nun auf die Silabs IDE umgestiegen, wobei ich nach wie vor die C51 
compiler und linker von uvision verwende. In der Silabs IDE wird 
automatisch ein config string für compiler und linker erstellt.

Erst hatte ich die gleichen Resultate, dann habe ich
unter den Compiler optinen das Tag: ROM(Compact) - 2k functions, 64k 
programm gesetzt, und nun funtioniert das programm.

Was genau habe ich da geändert?

PS: In der Silabs IDE kann ich die speicherbereiche selber einstellen, 
aber wie genau gehe ich da vor?

von cidex (Gast)


Lesenswert?

Ok habe nun durch eingene Erfahrung und diese 
(http://www.esacademy.com/faq/docs/51memmodel/index.htm) Website einiges 
herausgefunden. Werde das jetzt hier mal in meinen Worten wiedergeben 
und hoffe das man mich gegebenenfalls berichtigt.

Wenn man so wie in meinem Fall mit dem kleinem speicher modell 
(variablen in Data) nicht auskommt sollte man nicht anfangen selber 
variablen in xdata zu legen (anscheinend führt das generell zu 
Problemen!?). Sondern unter der Compiler Optionen auf das Large memory 
model umsteigen und dann Variablen bei denen man sich schnelleren 
Zugriff wünscht in data verschieben und funktionen bei denen man 
schnellere Ausführung wünscht (z.B.: ISRs) das small Tag verwenden.

von Mario (Gast)


Lesenswert?

Hi cidex,

danke für den Link zum 51er-Memory-Model. Hat mir sehr geholfen und 
möchte ich ebenfalls empfehlen. Denn so vollständig durchschaut haben 
den 51er-Speicher doch wohl die wenigsten, oder?!

Viele Grüße,
Mario

von Ralf (Gast)


Lesenswert?

Also, ich hab schon mehrere 8051/8052-Derivate mit internem XRAM und 
Keil am Laufen gehabt, ohne Probleme. MemoryModell hab ich immer auf 
SMALL gelassen.

Ohne konkretes Projekt kann ich leider keine Aussage liefern, woran's 
bei euch liegt. Wie Peter bereits geschrieben hatte, ist es wichtig, die 
passenden Einstellungen zu machen.

Ralf

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.