Pregunta

Este es mi primer post, y cubre algo que yo he estado tratando de hacer funcionar de manera intermitente durante aproximadamente un año.

En esencia se reduce a lo siguiente: Tengo una copia de newlib la que estoy tratando de conseguir trabajo en una LPC2388 (un ARM7TDMI de NXP). Esto es en una máquina Linux usando el brazo-elf-gcc

La pregunta que tengo es que he estado buscando en muchos de los tutoriales que hablan de portar newlib, y todos hablan de los talones (como salida, abierta, de lectura / escritura, sbrk), y tengo una bonita buena idea de cómo poner en práctica todas estas funciones. Pero donde ¿Debo poner?

Tengo la distribución newlib de sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz y después de hurgar encontré "syscalls.c" (en newlib-1.18.0 / newlib / libc / sys / brazo) que contiene todos los talones de la que tengo que actualizar, pero todos ellos están bien rellena con acabado en busca de código (que hace no parecen funcionar sin la crt0.S, que sí no funciona con mi chip).

¿Debo estar acabando con esas funciones a mí mismo, y re-escribirlos? O debería escribirlos en otro lugar. ¿Debo hacer una carpeta nueva en newlib / libc / sys con el nombre de mi "arquitectura" y cambiar el objetivo de igualar?

También me interesa saber si hay etiqueta adecuada en la distribución de algo como esto después de la liberación como un proyecto de código abierto. Actualmente tengo un script que descarga binutils, brazo-elf-gcc, newlib y GDB, y compila ellos. Si estoy modificando los archivos que se encuentran en el directorio newlib, debería entregar un parche que se aplica auto-mi guión? O debería añadir el newlib modificado en el repositorio?

Gracias por tomarse la molestia de leer! Después de esto está un desglose más detallado de lo que estoy haciendo.


Para aquellos que quieren / necesitan más información sobre mi configuración:

Estoy construyendo una consola de videojuegos ARM basado libremente en el proyecto uzebox ( http://belogic.com/uzebox/ ).

he estado haciendo todo tipo de cosas que tiran de una gran cantidad de recursos que lo intento y la figura hacia fuera. Usted puede leer sobre el inicio de mis aventuras aquí (foros de Sparkfun, nadie responde como lo averigüe por mi cuenta): forum.sparkfun.com/viewtopic.php?f=11&t=22072

He seguido todo esto mediante la lectura a través de las preguntas sobre Stackoverflow portar newlib y vio algunas de las diferentes tutoriales (como wiki.osdev.org/Porting_Newlib) sino que también sufren de decirme a implementos talones sin mencionar dónde, quién , qué, cuándo, o cómo!

¿Fue útil?

Solución

Pero, ¿dónde debería ponerlos?

Se puede ponerlos donde quieras, siempre y cuando existan en el último eslabón. Es posible incorporar en la propia biblioteca libc, o es posible mantener esa genérica, y tienen las llamadas al sistema como un archivo objeto específico objetivo separado o biblioteca.

Es posible que tenga que crear sus propios crt0.s específicos de destino y montar y vincularlo a su objetivo.

Un buen tutorial de Miró Samek de saltos cuánticos en conseguir el desarrollo de GNU / ARM en funcionamiento está disponible aquí . Los ejemplos se basan en una parte Atmel AT91 por lo que tendrá que saber un poco acerca de su dispositivo NXP para adaptar el código de puesta en marcha.

Una lista hecha NEWLIB capa de portar LPC2xxx era aquí , pero los enlaces ot teh archivos aparecen estar rotas. La misma capa de portabilidad se utiliza en Martin Thomas' WINARM proyecto. Se trata de un puerto de Windows de GNU ARM GCC, pero los ejemplos incluidos en ella son específicos de destino no específica de acogida.

Sólo es necesario modificar la capa de portabilidad en NEWLIB, y puesto que es destino y específico de la aplicación, no es necesario (de hecho probablemente no debería) enviar su código al proyecto.

Otros consejos

Cuando yo estaba usando newlib eso es exactamente lo que hice, impactó crt0.s, syscalls.c y libcfunc.c. Mi preferencia personal era eslabón de la sustitución de crt0.s y syscalls.c (laminado en las pocas funciones en libcfunc en la sustitución syscalls.c) en base a la aplicación incrustada.

Nunca tenía un interés en empujar hacia atrás nada de eso trabajo en la distro, así que no puedo ayudar allí.

Está en el camino correcto, sin embargo, crt0.S y syscalls.c son en la que desea trabajar para personalizar para su objetivo. En lo personal yo estaba interesado en una biblioteca C (y printf) y me principalmente neutro todas las funciones para devolver 0 ó 1, o lo que fuera necesario para obtener la función de trabajo justo y no ponerse en el camino de la vinculación, por lo que periódicamente el archivo que he funciones de E / S operan en vinculado en los datos en la ROM / RAM. Básicamente sin tener que reemplazar o modificar cualquier otro archivo en newlib que tenía una buena cantidad de éxito, así que estás en el camino correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top