Hab ein kleines problem, will Daten in einen bestimmten bereich schreiben. Nun hab ich eigentlich im User's Guide gelesen wie dies mit einem macro gemacht werden kann, nähmlich: macro: #define XARRAY(objekt, addr) (*((object volatile xhuge * )(addr))) lesen aus diesem bereich: i = XARRAY(int, 0x8000)[10] schreiben aus diesem bereich: XARRAY(int, 0x8000)[10] = 0x838 soviel zur theorie, habs genau so gemacht, doch der compiler gibt mir folgende fehlermeldung: The left side of an array-access experession array[x] does not represent an array or pointer type. in the lattter case, the pointer must not be ot type void *p was mach ich falsch? was mich an dem ganzen noch etwas stört ist die tatsache das der compiler nie wirklich wissen kann, wievil speicherplatz er reservieren muss, respektive wieviel Elemente das Array umfassen wird... kann mir das auch jemand erklären?? besten dank im Voraus mfg Sandro
Die Fehlermeldung verschwindet möglicherweise, wenn die Wörter "objekt", "volatile" und "huge" in einer anderen Reihenfolge angeordnet werden. Ich würde den Datentypspezifizierer als letztes auflisten. Mit Verwendung dieses Makros wird überhaupt gar kein Speicher reserviert, sondern munter drauflos in den Speicher (beginnend ab der übergebenen Adresse) geschrieben. Verantwortlich für die Speicherverwaltung bei dieser Art des Zugriffst bist Du, der Programmierer. Du musst wissen, wieviel Speicher bei welcher Adresse Du für irgendwas verwenden möchstest. Das erscheint mir wenig sinnvoll. Wozu willst Du "auf einen bestimmten Bereich" zugreifen?
Marks Murks Keil die neueste version (glaube 5.05 bin mir aber nicht ganz sicher, bin gerade nicht im geschäft) Rufus T. Firefly ja dachte scho das da nichts reserviert wird, gibts beim keil kompiler eine möglichkeit das ganz so zu lösen das der speicherplatz reserviert wird?? Wiso? es geht darum messergebnisse über einen längeren Zeitraum abzuspeichern (um anschliesend die auswertung zu optimieren). Dabei wird der uP immer wieder an und ausgeschaltet, desshalb möcht ich die daten in einen bestimmten bereich des flash schreiben, damit ich genau weiss wo ich diese wieder holen kann... mfg Sandro
Es gibt compilerspezifische Möglichkeiten, die Speicheradresse eines Objektes bei dessen Definition festzulegen. Wenn ich mich recht erinnere, war hier vor einigen Monaten mal genau dasselbe Thema im Gespräch, nur wurde damals gcc verwendet. Das müsste aber eindeutig in der Compilerdokumentation beschrieben sein; ich würd' auch mal die Dokumentation des Linkers zu Rate ziehen. Du bist Dir im klaren darüber, daß Schreibzugriffe aufs Flash-ROM ganz anders aussehen müssen als Schreibzugriffe aufs normale RAM? Wie exakt, das sollte in der Dokumentation Deines Prozessors beschrieben sein - möglicherweise im Kontext eines Bootloaders oder ähnlichem. Desweiteren solltest Du bedenken, daß ein Flash-ROM eine begrenzte Lebensdauer hat, es wird nur einige tausend Schreibzugriffe überleben (siehe Datenblatt des µC). Wenn Du also Deine Messwerte permanent ins Flash schreibst, kannst Du Dir das Messwertespeichern irgendwann auch sparen ... und der Controller erzählt Dir was von Alzheim. Besser ist hier ein NVRAM, das wahlweise aus einem normalen SRAM nebst Akku/Batterie/Goldcappufferung, einem "fertigen" gepufferten SRAM (wie MK48T08) oder einem MRAM/FERAM bestehen kann.
Rufus T. Firefly danke für deine antwort, ja ist mir klar das die Schreibzugriffe beieinem Flash-Rom stark begrenzt sind, brauch das ganze jedoch nur auf meinem entwicklungsboard, um mir das messen einfacher zu machen... hab bis anhin nichts gefunden, aber werd mir wohl die doku morgen nochmals zu gemüte führen... mfg sandro
Hallo Sandro, habe von KEIL wenig Ahnung. Aber hier ein Beispiel für Tasking, geht bei Keil vielleicht ähnlich? Natürlich musst Du dem Compiler bzw. Linker auch den entsprechenden Bereich als ROM-freigeben. #ifdef EXT_FLASH #ifdef TASKING_5X // Compiler Version 5.x #pragma combine fb=A0x200 const unsigned char Flash_Device[]= { 0xD1,......,0x00 }; #pragma default_attributes #endif #ifdef TASKING_7X // Compiler Version 7.5x const unsigned char Flash_Device[] _at(0x200) = { 0xD1,.....,0x00 }; #endif #endif Hier das gleiche für einen RAM-Bereich: #ifdef TASKING_5X // Compiler Version 5.x #pragma combine fb=A0x100000 huge unsigned char LAN91C96Adresse[16] ; #pragma default_attributes #endif #ifdef TASKING_7X // Compiler Version 7.5x huge unsigned char LAN91C96Adresse[16] _at(0x100000) ; #endif
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.