Speicherbereich zuweisen (C167)

Gast #156865
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
Gast #156867
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?
Gast #156868
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
Gast #156869
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.
Gast #156870
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
Gast #156871
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.