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