Forum: Mikrocontroller und Digitale Elektronik Speicherbereich zuweisen (C167)


von Sandro (Gast)


Lesenswert?

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

von Marks Murks (Gast)


Lesenswert?

Welcher Compiler, Keil oder Tasking? Welche Version?

von Rufus T. Firefly (Gast)


Lesenswert?

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?

von Sandro (Gast)


Lesenswert?

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

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Sandro (Gast)


Lesenswert?

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

von Marks Murks (Gast)


Lesenswert?

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