Forum: Compiler & IDEs bss Section im externen RAM


von Norman M. (norman)


Lesenswert?

Hallo,

ich probiere gerade ein wenig am Olimex LPC-L2294 Board herum um einige
Hintergründe zu verstehen.

Da ich ein Programm drauf bringen will, wovon ich schon weiß, dass die
bss section nicht in den internen RAM passt, habe ich in meinem
Testprogramm nun mal das Linkerscript so modifiziert, dass die bss
section in den externen RAM gelegt wird.

Also die Änderungen beschränken sich auf folgende Zeilen:

ext_ram  : ORIGIN = 0x810E6FFF, LENGTH = 100K   //hinzugefügt

und

.bss :
{
  _bss_start = .;
  *(.bss)
} >ext_ram    //geändert von ram auf ext_ram

Sonst habe ich nichts geändert.

Nun hab ich beim debuggen gemerkt, dass in der Variablen, welche in der
bss section abgelegt wird, nichts sinnvolles drin steht, und auch nach
einer Zuweisung sich der Wert nicht ändert.

Was muss ich noch ändern, damit die ganz normal, als wäre die bss
section im internen RAM läge, ansprechbar ist?

Muss ich noch Änderungen im Startup code vornehmen?

Wenn ihr noch weitere Infos braucht, poste ich die natürlich gleich
nach.

Gruß,

Norman

von ozo (Gast)


Lesenswert?

Bist du dir sicher, dass LENGTH = 100K verstanden wird?
Sollte das nicht eher irgendwie so ausschauen: LENGTH = 0x19000 ?
Nur ein Schuss ins Blaue...

von Norman M. (norman)


Lesenswert?

Hey,

das habe ich so noch nicht kontrolliert. Das Linkerscript habe ich einem 
Beispielprogramm von Olimex übernommen. Von daher denke ich dass es 
passt.
Die Länge des Flash war da z.B. auch schon so angegeben...

von ozo (Gast)


Lesenswert?

Ich hab mal nach einem olimex Linkerscript gegoogelt, da sieht der 
entsprechende Abschnitt so aus:
-----
.bss :
  {
    _bss_start = .;
    *(.bss)
  } >ram

  . = ALIGN(4);
  _bss_end = . ;
----
Falls das bei dir auch der Fall ist, solltest du unbedingt noch _bss_end 
mit in die ext_ram section aufnehmen!
-----
.bss :
  {
    _bss_start = .;
    *(.bss)
    . = ALIGN(4);
    _bss_end = . ;
  } >ram_ext

von Norman M. (norman)


Lesenswert?

Hey,

danke  für die Antwort!

Also bei mir sieht das so aus, wie du es geschrieben hast. Also

.bss :
  {
    _bss_start = .;
    *(.bss)
  } >ram

  . = ALIGN(4);
  _bss_end = . ;

Könntest du mir erklären was da genau der Unterschied ist, bei beiden 
Varianten? Hab da noch so meine Problem das genau zu verstehen.

Norman

von ozo (Gast)


Lesenswert?

Naja, irgendwo im Startup Code (also der Code der noch vor main() 
ausgeführt wird) steht eine Codesequenz, die BSS von _bss_start bis 
_bss_end ausnullt.
Bei deiner Version vom Linkerscript liegt bss_start im externen ram, 
bss_end aber nicht.
Aber hey, keine Garantie auf garnix und wenn das nichts bringt, bin ich 
mit meinem Latein am Ende :(
Und ich trau mich ja kaum zu fragen, musst du das externe ram irgendwie 
initialisieren, oder läuft das sofort? Kenn mich mit dem ARM nicht aus, 
kenne  nur einen mips mit ddr controller drin und den musste man recht 
ausführlich initialisieren, bevor da das externe ram tat.

von Norman M. (norman)


Lesenswert?

Also das externe RAM wird dann im Programm initialisiert.

Leider hat das ganze keine Veränderung gebracht. Trotzdem danke!

Hat noch jemand eine andere Idee?

Gruß,

Norman

von ozo (Gast)


Lesenswert?

schau mal hier, die machen was ähnliches. ist vielleicht als erster test 
brauchbar, bevor du dann bss in den externen ram legst.
Beitrag "linkerskript Frage (LPC2000er)"

von Norman M. (norman)


Lesenswert?

Hm,

so richtig kann ich damit nichts anfangen.

ich Habe jetzt noch mal ein wenig getestet. Es hat eigentlich gar nichts 
speziell mit der bss Section zu tun.

Vielmehr ist es so, dass ich überhaupt nicht auf externen Speicher 
zugreifen kann. Weder auf den externen Flash, noch auf den externen RAM.

Die BCFG-Register sind wie folgt konfiguriert:

BCFG0 für den ext. Flash:

BCFG0 = 0x1000348F

und BCFG1 für den ext. RAM:

BCFG1 = 0x2000FFEF

PINSEL2 ist mit 0x0F804824 konfiguriert. Damit sollten die 
entsprechenden Pins als Adresslines,Datenlines und Chip Select genutzt 
werden.

Muss man da noch irgendeine Einstellung vornehmen?

Gruß,

Norman

von ozo (Gast)


Lesenswert?

the magic smoke just has left the device?

such doch mal hier
http://www.embeddedrelated.com/groups/lpc2000/1.php
nach "2294"

von Norman M. (norman)


Lesenswert?

Habe den Fehler gefunden. Habe bei der Konfiguration von PINSEL2 aus 
uneerklärlichem Grund nicht das Bit für Write Enable gesetzt. Blöder 
Fehler...

Jetzt entsteht mir daraus noch eine Frage, die ich bisher noch nicht 
lösen konnte. Und zwar muss ich, um die bss Section im Startupcode 
"ausnullen" zu können, die Konfiguration von PINSEL2 nun schon mit in 
den Startup Code nehmen.

Aber wie kann ich Register im Startupcode beschreiben? Bin dessen leider 
überhaupt nicht mächtig.

Gruß,

Norman

von Norman M. (norman)


Lesenswert?

Hat da keiner ne Idee? Habe jetzt schon einige Versuche im Startup Code 
gemacht aber bekomme es nicht hin.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Nicht die kürzeste Variante aber sollte reichen:
LDR r1,=AddresseVonPINSEL2
LDR r2,=WertfuerPinsel2
STR r2,[r1]
Ansonsten kann man sich auch eine C-Funktion schreiben und diese von 
Startup-Code aus aufrufen. Ist vielleicht übersichtlicher, wenn man sich 
nicht mit Assembler rumschlagen will: (a) .global für externe Funktion 
(b) Stackpointer setzen (z.b. auf RAM-Ende) (c) LDR register, Addr. von 
externer Funktion (d)  BL register. Als Vorlage siehe z.B. diverse 
Beispiele für AT91SAM, lowlevelinit(). Das Prinzip her nicht 
AT91-spezifisch.

von Norman M. (norman)


Lesenswert?

Also die erste Variante habe  ich gerade mal wie folgt ausprobiert:

ldr     r3, =0xE002C014
ldr     r4, =0x0FE149E4
str  r4, [r3]

Das scheint aber nicht zu funktionieren. Danach kommt der Teil für das 
Nullen des Speicherbereichs der bss-Section, was aber nicht 
funktioniert.

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.