Frage

Dies ist mein erster Beitrag, und es deckt etwas, was ich versucht habe und Ausschalten für etwa ein Jahr jetzt zum Laufen zu bringen.

Im Wesentlichen läuft es auf den folgende unten: Ich habe eine Kopie von newlib, die ich versuche, auf einem LPC2388 zum Laufen zu bringen (ein ARM7TDMI von NXP). Dies ist auf einer Linux-Box mit Arm-elf-gcc

Die Frage, die ich habe ist, dass ich habe an vielen Tutorials suchen sprechen über newlib portieren, und sie alle sprechen über die Stümpfe (wie Ausgang, Öffnen, Lesen / Schreiben, sbrk), und ich habe eine ziemlich gute Vorstellung davon, wie all diese Funktionen zu implementieren. Aber mit sollte ich ihnen sagen?

Ich habe die newlib Verteilung von sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz und nach etwa ich Stossen gefunden "syscalls.c" (in newlib-1.18.0 / newlib / libc / sys / Arm), die alle die Stubs enthält, die ich zu aktualisieren, aber sie alle gefüllt sind mit eher suchen Code fertig (das tut nicht scheinen ohne crt0.S zu arbeiten, was selbst nicht mit meinem Chip).

Soll ich werden Abwischen nur jene Funktionen selbst, und Umschreiben sie? Oder sollte ich schreibe sie woanders. Soll ich einen ganz neuen Ordner in newlib / libc / sys mit dem Namen meiner „Architektur“ und das Ziel entsprechend ändern?

Ich bin auch neugierig, ob es über die Verteilung der so etwas wie dies die richtige Etikette ist, nachdem es als Open-Source-Projekt freigegeben wird. Im Moment habe ich ein Skript, das Downloads binutils, arm-elf-gcc, newlib und gdb, und stellt sie zusammen. Wenn ich Dateien bin modifizieren, die im newlib Verzeichnis sind, sollte ich einen Patch Hand, die mein Skript automatisch gilt? Oder soll ich das modifizierte newlib zum Repository hinzufügen?

Vielen Dank für die Mühe zu lesen! Im Anschluss daran ist eine detailliertere Aufschlüsselung von dem, was ich tue.


Für diejenigen, die / benötigen weitere Informationen über mein Setup wollen:

Ich baue eine ARM Spielkonsole basiert lose auf dem Uzebox Projekt ( http://belogic.com/uzebox/ ).

Ich habe alle möglichen Dinge getan, von vielen verschiedenen Ressourcen ziehen, wie ich versuchen, es herauszufinden. Sie können über den Beginn meiner Abenteuer hier lesen (sparkfun Foren, niemand reagiert, wie ich es herausfinden, auf meinem eigenen): forum.sparkfun.com/viewtopic.php?f=11&t=22072

folgte ich all dies durch durch die Stackoverflow Fragen der Lektüre über newlib Portierung und sah ein paar der verschiedenen Tutorials (wie wiki.osdev.org/Porting_Newlib), aber sie leiden auch von mir, ohne zu erwähnen, um Arbeitsgeräte Stubs zu sagen, wo, wer , was, wann, oder wie!

War es hilfreich?

Lösung

Aber wo soll ich ihnen sagen?

Sie können sie setzen, wo Sie wollen, so lange sie in der letzten Verbindung vorhanden sein. Sie könnten sie in der libc-Bibliothek übernehmen selbst, oder Sie vielleicht, dass generische halten und haben die syscalls als separate zielspezifische Objektdatei oder Bibliothek.

Sie müssen Ihre eigene zielspezifische crt0.s erstellen und montieren und verbinden Sie sich für Ihr Ziel.

Ein gutes Tutorial von Miro Samek von Quantensprüngen auf immer GNU / ARM Entwicklung und läuft verfügbar ist hier . Die Beispiele basieren auf einem Teil Atmel AT91 so müssen Sie ein wenig über Ihr NXP Gerät kennen, um den Start-up-Code anzupassen.

Eine fertige Newlib Portierungsschicht für LPC2xxx betrug verfügbar , aber die Links ot teh Dateien erscheinen, gebrochen zu werden. Die gleiche Portierungsschicht wird in Martin Thomas' verwendet WinARM Projekt. Dies ist eine Windows-Portierung von GNU ARM GCC, aber die Beispiele darin sind zielspezifische nicht Host-spezifisch enthalten.

Sie sollten nur benötigen die Portierungsschicht auf Newlib zu ändern, und da es Ziel ist und anwendungsspezifische, Sie müssen nicht (in der Tat sollte wahrscheinlich nicht) Code für das Projekt vor.

Andere Tipps

When I was using newlib that is exactly what I did, blew away crt0.s, syscalls.c and libcfunc.c. My personal preference was to link in the replacement for crt0.s and syscalls.c (rolled the few functions in libcfunc into the syscalls.c replacement) based on the embedded application.

I never had an interest in pushing any of that work back into the distro, so cannot help you there.

You are on the right path though, crt0.S and syscalls.c are where you want to work to customize for your target. Personally I was interested in a C library (and printf) and would primarily neuter all of the functions to return 0 or 1 or whatever it took to get the function to just work and not get in the way of linking, periodically making the file I/O functions operate on linked in data in rom/ram. Basically without replacing or modifying any other files in newlib I had a fair amount of success, so you are on the right path.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top