Forum: Mikrocontroller und Digitale Elektronik ARM L2294 ext. SRAM


von Stefan (Gast)


Lesenswert?

Hallo,
ich habe eine Frage zum Einrichten eines statischen
Byte-Arrays im ext. SRAM eines LPC2294 (Olimex-Board
L2294-8MB, Eclipse/Yagarto):

Kann ich nach der Konfiguration der Register PINSEL2=...
und BCFGx=... in meiner main.c bereits in einer Sub-Prozedur
ein funktionierendes statisches ARRAY deklarieren
(mit fester Adresse irgendwo >= 0x8000 0000) ?

Falls ja, mit welchem GCC-Befehl geht das (
1
 char gdata[100000] (????)
-> ich bin mit speziellen GCC-Befehlen noch nicht so firm ...)

Falls nein, sind da tiefere Eingriff in den startup assembly
code erforderlich ?

Über einen kleinen Denkanstoss würde ich mich freuen; ich habe
bislang nur AVR (ASM/GCC) programmiert und nachdem die
ARM-UART0-Ausgabe klappt wird der LPC immer interessanter ...

Danke vorab für jede Hilfe
und Grüße,
Stefan

von Stefan (Gast)


Lesenswert?

Testweise habe ich versucht, das ARRAY explizit in einem separaten
Segment unterzubringen
also lokale Deklaration in einer Prozedur mit:
1
  static char gdata[100000] __attribute__ ((section (".xtd")));
sowie Einträge im linker-skript:
unter memory
1
MEMORY 
2
{
3
  [... hier steht noch was]
4
  xtd            : ORIGIN = 0x80000000, LENGTH = 0x160000 
5
}
unter sections:
1
SECTIONS 
2
{
3
  [... hier steht noch was]
4
  .bss :                /* collect all uninitialized .bss sections that go into RAM  */
5
  {
6
    _bss_start = .;          /* define a global symbol marking the start of the .bss section */
7
    *(.bss)              /* all .bss sections  */
8
  } >ram                   /* put all the above in RAM (it will be cleared in the startup code */
9
10
  . = ALIGN(4);            /* advance location counter to the next 32-bit boundary */
11
  _bss_end = . ;            /* define a global symbol marking the end of the .bss section */
12
  
13
  .xtd :                /* hinzugefügt: extended segment */
14
  {
15
    _xtd_start = .;
16
    *(.xtd)
17
    _xtd_end = .;
18
  } >xtd
19
}
20
  _end = .;              /* define a global symbol marking the end of application RAM */
mit dem Ergebnis:
-> Abarbeitung des make-Befehl dauert dann ziemlich lange,
-> Philips Flash Utility Upload schlägt fehl ("invalid hex file" )

Ich vermute, dass ich nicht drum herum komme, meine Variable in der 
.bss-Sektion zu platzieren und alles in den ext. Sram zu verlagern; nur 
kann das ja nicht sein, oder -> Henne/Ei-Problematik, da ich den EMC ja
erst in main() konfiguriere ... verwirrt

Kennt sich jemand mit der ext. sram-Deklaration aus bzw. kann mir
eine geeignete Quelle zum Nachlesen an die Hand geben ?

Gruß,
S.

von Martin L. (Gast)


Lesenswert?

Hallo,

mit dem normalen lpc21isp kannst Du nur den internen Flash beschreiben. 
Das utility weiß ja nix von dem externen Ram, noch wie dieser konkret 
angeschlossen ist. Weil der Eintrag aber immer noch in der HEX-Datei 
ist, gibt es den Fehler.
Du musst also die HEX-Datei so erzeugen, dass das xtd-Segment nicht mehr 
aus der elf Datei in die hex-Datei kommt. Schau Dir mal die -j und -R 
Option von objcopy an. (-R xst sollte Dein Problem lösen.)

Viele Grüße,
 Martin L.

PS: Alternativ kannst Du auch einfach einen Pointer <static char 
*getdata=0x8000000;> deklarieren und damit arbeiten als wäre es ein 
Array. Musst Dich dann, wenn Du mehrere Daten im Speicher hast, aber 
selber um die korrekten Adressen in Abhängigkeit der Größen kümmern 
weswegen das eigentlich keine saubere Lösung ist.

von Stefan (Gast)


Lesenswert?

Hallo Martin,
vielen Dank für deine Antwort. Nachdem ich entsprechend deinem
Tipp in mein makefile
1
 -R .xtd
eingefügt hatte, klappte das auch mit dem Upload. Ich hab aktuell
noch ein Problem die korrekten Daten zu bekommen ... hab da aber
schon einen dringenden Verdacht ;-)

Vielen Dank nochmals für deine schnelle Antwort und Hilfe.

Gruß,
Stefan

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.