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
Bist du dir sicher, dass LENGTH = 100K verstanden wird? Sollte das nicht eher irgendwie so ausschauen: LENGTH = 0x19000 ? Nur ein Schuss ins Blaue...
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...
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
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
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.
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
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)"
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
the magic smoke just has left the device? such doch mal hier http://www.embeddedrelated.com/groups/lpc2000/1.php nach "2294"
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
Hat da keiner ne Idee? Habe jetzt schon einige Versuche im Startup Code gemacht aber bekomme es nicht hin.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.