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?
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
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
>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.
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.
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?
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.
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
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