bss Section im externen RAM

#826170
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
Gast #826648
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
#826652
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
Gast #826669
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.
#827664
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
#828683
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
Moderator Persönliche Seite #828894
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren