Question

est mon premier post, et il couvre quelque chose que j'ai essayé de faire travailler sur et en dehors pendant environ un an.

Pour l'essentiel, il se résume à ce qui suit: J'ai une copie de newlib que je suis en train de faire travailler sur un LPC2388 (un ARM7TDMI de NXP). Ceci est une boîte de linux en utilisant arm-elf-gcc

La question que j'ai est que je l'ai regardé beaucoup de tutoriels parler de portage newlib, et ils parlent tous les talons (comme la sortie, ouvert, lecture / écriture, sbrk), et j'ai assez bonne idée de la façon de mettre en œuvre toutes ces fonctions. Mais devrais-je les mettre?

J'ai la distribution de newlib de sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz et après farfouillé j'ai trouvé "syscalls.c" (en newlib-1.18.0 / newlib / libc / sys / bras) qui contient tous les bouts que je dois mettre à jour, mais ils sont tous remplis avec un peu fini de regarder le code (qui fait pas semblent fonctionner sans crt0.S, qui lui-même ne fonctionne pas avec ma puce).

Dois-je me juste Anéantir les fonctions moi-même, et les ré-écriture? Ou devrais-je les écrire ailleurs. Dois-je créer un nouveau dossier entier dans newlib / libc / sys avec le nom de mon « architecture » et changer la cible pour correspondre?

Je suis aussi curieux de savoir s'il y a une étiquette appropriée sur la distribution de quelque chose comme ça après avoir libéré comme un projet open source. J'ai actuellement un script qui télécharge binutils, arm-elf-gcc, newlib et gdb, et compile eux. Si je suis en train de modifier les fichiers qui sont dans le répertoire newlib, dois-je remettre un patch qui applique automatiquement mon script? Ou devrais-je ajouter le newlib modifié au dépôt?

Merci pour prendre la peine de lire! Suite à cela est une ventilation plus détaillée de ce que je fais.


Pour ceux qui veulent / ont besoin de plus d'informations à propos de ma configuration:

Je construis une console ARM jeu vidéo vaguement basé sur le projet uzebox ( http://belogic.com/uzebox/ ).

Je fais toutes sortes de choses tirant de beaucoup de différentes ressources que j'essaie de comprendre. Vous pouvez lire le début de mes aventures ici (forums Sparkfun, personne ne répond que je le découvrir par moi-même): forum.sparkfun.com/viewtopic.php?f=11&t=22072

J'ai suivi tout cela en lisant à travers les questions Stackoverflow sur le portage newlib et a vu quelques-uns des différents tutoriels (comme wiki.osdev.org/Porting_Newlib), mais ils souffrent aussi de me dire à talons sans mentionner implémente où, qui , quoi, quand, ou comment!

Était-ce utile?

La solution

  

Mais où dois-je les mettre?

Vous pouvez les mettre où vous voulez, tant qu'ils existent dans le dernier maillon. Vous pouvez les incorporer dans la bibliothèque libc elle-même, ou vous pouvez garder ce générique, et ont les syscalls comme un fichier objet spécifique cible séparée ou d'une bibliothèque.

Vous devrez peut-être créer vos propres crt0.s spécifiques de cible et d'assembler et de le relier à votre cible.

Un bon tutoriel par Miro Samek de Quantum Leaps sur l'obtention de développement GNU / ARM et en cours d'exécution est disponible ici . Les exemples sont basés sur une partie Atmel AT91 donc vous aurez besoin de connaître un peu plus sur votre appareil de NXP pour adapter le code de démarrage.

Un prêt fait couche portage newlib pour LPC2xxx n'a ici , mais les liens ot teh fichiers semblent brisés. La même couche de portage est utilisé dans Martin Thomas' WinARM projet. Ceci est un port de Windows de GNU ARM GCC, mais les exemples inclus dans ce ne sont pas spécifiques d'hôte spécifique cible.

Vous ne devriez avoir besoin de modifier la couche de portage sur newlib, et comme il est la cible et spécifique à l'application, vous ne devez pas (en fait ne devrait probablement pas) soumettre votre code au projet.

Autres conseils

Quand j'utilisais newlib qui est exactement ce que je l'ai fait, bluffé crt0.s, syscalls.c et libcfunc.c. Ma préférence personnelle était de lien dans le remplacement des crt0.s et syscalls.c (roulé quelques fonctions libcfunc dans le remplacement de syscalls.c) en fonction de l'application embarquée.

J'ai jamais eu un intérêt à pousser tout cela de retour de travail dans la distro, ne peut donc pas vous aider.

Vous êtes sur la bonne voie cependant, crt0.S et syscalls.c sont là où vous voulez travailler pour personnaliser votre cible. Personnellement, je me suis intéressé à une bibliothèque C (et printf) et je principalement castrer toutes les fonctions de retourner 0 ou 1 ou ce qu'il fallait pour obtenir la fonction de travail juste et ne pas obtenir de la manière de relier, en faisant périodiquement le fichier I / fonctions O fonctionnent sur des données liées dans la mémoire morte / mémoire vive. Fondamentalement, sans remplacer ou modifier tout autre fichier dans newlib j'avais un montant juste de la réussite, vous êtes sur la bonne voie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top