www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Speicherbereich zuweisen (C167)


Autor: Sandro (Gast)
Datum:

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

Autor: Marks Murks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Compiler, Keil oder Tasking? Welche Version?

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Sandro (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Sandro (Gast)
Datum:

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

Autor: Marks Murks (Gast)
Datum:

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

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.