www.mikrocontroller.net

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


Autor: cidex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: AndreB (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: cidex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: cidex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: cidex (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: cidex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.