Forum: Compiler & IDEs LPC2148 + FLASH ROM Speicher


von RedFlash (Gast)


Lesenswert?

Hallo,
schreibe gerade ein Programm für einen LPC2148.
Dazu möchte ich den (relativ) großen (~500KB) Flash Speicher nutzen.
Ich möchte ca. 300 KB an Nutzdaten  speichern, um diese per RS232 
übertragen.
da ich kein __at bzw. AT() mit den GNU GCC verwenden kann, habe ich mir 
das linkerskript angeschaut.
dort finde ich:
  /* .rodata section which is used for read-only data (constants) */

  .rodata :
  {
    *(.rodata)
    *(.rodata*)
  } > FLASH

aber auch mit den schlüsselwort "const" erhalte ich beim linken den 
Fehler:
"region RAM is full".
Die "Nutzdaten" werden mit
const unsigned char Buffer[307200]={0x00, ..... ,0x00};
angelegt.

laut Kommentar müsste const ausreichend sein oder ?
oder muss ich den genauen Speicherbereich angeben ?

Danke im Voraus für die Hilfe

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Die Sektion .rodata im ROM enthält die Daten für die Sektion .data im 
RAM, die bei Programmstart vom Startupcode umkopiert werden.

Du müsstest dir im Linkerskript eine selbst benannte Sektion im ROM 
anlegen und im Quelltext veranlassen, dass die Variable in dieser 
Sketion angelegt wird.

Wie das mit den Linkerskripten funktioniert, kannst du herausfinden in 
der Beschreibung der Linkerskripte und des Linkers ld

http://www.mikrocontroller.net/articles/ARM-DevCpp#Links

Wie das mit dem Ablegen von Variablen in Sektionen funktioniert, kannst 
du herausfinden bei der Beschreibung des attribute Schlüsselworts 
(wahllose Links von Google, nicht ARM-GCC-ELF spezifisch gesucht)

http://www.ohse.de/uwe/articles/gcc-attributes.html
http://developer.apple.com/documentation/DeveloperTools/gcc-3.3/gcc/Variable-Attributes.html

Noch mal aufpassen müsstest du bei den Lesezugriffen, wenn du ein Target 
mit Harvard-Architektur hättest, aber da ist seitens des LPC2148 alles 
im grünen Bereich (anders beim AVR siehe PROGMEM...).

von Stefan B. (stefan) Benutzerseite


Lesenswert?

ADD:

> const unsigned char Buffer[307200]={0x00, ..... ,0x00};
                             ^^^^^^
Bist du sicher das DAS funktioniert?
Wie ist denn das typedef für size_t auf deinem System?

von RedFlash (Gast)


Lesenswert?

Danke für die Hilfe
mit

const unsigned char raw_data[STORAGE_SIZE] _attribute_ ((section 
(".rodata")));

habe ich das erreicht, was ich wollte.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Und der Startupcode kopiert das nicht um (ROM => RAM), oder stört dich 
das nicht?

von RedFlash (Gast)


Lesenswert?

naja ... habe jetzt etwas besseres gefunden d.h. wie ich im 
Programmablauf Daten in den Flash ROM schreiben/lesen kann, habe es 
desshalb nicht weiter versucht. (allerdings hat mir 'make' kein Problem 
angezeigt. evtl. wäre ein Fehler beim starten des Mikrokontrollers 
aufgetreten.. werde ich jetze aber nicht weiter testen ;-) )

Danke Trotzdem

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.