www.mikrocontroller.net

Forum: Compiler & IDEs bss Section im externen RAM


Autor: Norman M. (norman)
Datum:

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

Autor: ozo (Gast)
Datum:

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

Autor: Norman M. (norman)
Datum:

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

Autor: ozo (Gast)
Datum:

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

Autor: Norman M. (norman)
Datum:

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

Autor: ozo (Gast)
Datum:

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

Autor: Norman M. (norman)
Datum:

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

Autor: ozo (Gast)
Datum:

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

Autor: Norman M. (norman)
Datum:

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

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
the magic smoke just has left the device?

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

Autor: Norman M. (norman)
Datum:

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

Autor: Norman M. (norman)
Datum:

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

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

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

Autor: Norman M. (norman)
Datum:

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

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.