30 votos

Bibliotecas estándar de C en bare metal

Yo soy sobre todo haciendo de desarrollo en los dispositivos que se han portado a Linux por lo que el estándar de la biblioteca de C proporciona mucha de su funcionalidad a través de la implementación de las llamadas del sistema que tienen un comportamiento estandarizado.

Sin embargo, para metal desnudo, no hay ningún sistema operativo subyacente. Hay una norma en relación a como una biblioteca de c deben ser implementadas, o no puede volver a aprender la particularidad de una biblioteca de implementaciones cuando se cambia a la nueva junta que proporciona una diferente BSP?

23voto

pipe Puntos 314

Sí, no es un estándar, simplemente la biblioteca estándar de C. La biblioteca de funciones no requieren de un "completo" OS, o de cualquier otro sistema operativo en todo, y hay un número de implementaciones de ahí a la medida para "bare metal" de código, Newlib quizás el más conocido.

Tomando Newlib como un ejemplo, se requiere escribir un pequeño subconjunto de funciones básicas, principalmente cómo los archivos y la asignación de memoria es manejado en su sistema. Si está utilizando un objetivo común de la plataforma, es muy probable que alguien ya hizo este trabajo para usted.

Si estás usando linux (probablemente también OSX y tal vez incluso cygwin/msys?) y escriba man strlen, debería haber una sección que se llama algo como CONFORMING TO, lo cual diría usted que la aplicación se ajusta a una norma específica. De esta manera usted puede averiguar si hay algo que he estado usando es una función estándar, o si depende de un sistema operativo específico.

10voto

Computist Puntos 158

Hay una norma en relación a como una biblioteca de c deben ser implementadas, o no puede volver a aprender la particularidad de una biblioteca de implementaciones cuando se cambia a la nueva junta que proporciona una diferente BSP?

En primer lugar, el C estándar define algo que se llama un "independiente" de la aplicación, como contraposición a la "acogida" de la ejecución (que es lo que la mayoría de nosotros estamos familiarizados con la gama completa de funciones de C soportado por el sistema operativo subyacente).

Un "independiente" implementación debe definir sólo un subconjunto de la biblioteca de C de los encabezados, es decir, aquellas que no requieren de apoyo, o incluso la definición de funciones (que se limita a hacer #defines y typedefs):

  • <float.h>
  • <iso646.h>
  • <limits.h>
  • <stdalign.h>
  • <stdarg.h>
  • <stdbool.h>
  • <stddef.h>
  • <stdint.h>
  • <stdnoreturn.h>

Cuando usted está tomando el siguiente paso hacia un hospedado de la aplicación, usted encontrará que son muy pocas las funciones que realmente necesita la interfaz "el sistema" de alguna manera, con el resto de la biblioteca, siendo aplicable en la parte superior de los "primitivos". En la aplicación de la PDCLib, he hecho algún esfuerzo para aislarlos en un subdirectorio separado para facilitar su identificación al trasladar la lib para una nueva plataforma (los ejemplos son para Linux puerto en paréntesis):

  • getenv() (extern char * * environ)
  • system() (fork() / execve() / wait())
  • malloc() y free() (brk() / sbrk())
  • _Exit() (_exit())
  • time() (aún no implementada)

Y para <stdio.h> (sin duda el más "OS involucrada" de la C99 encabezados):

  • de alguna forma, para abrir un archivo (open())
  • alguna manera de cerrarlo (close())
  • alguna manera de quitarlo (unlink())
  • alguna manera de cambiarle el nombre a (link() / unlink())
  • de alguna forma, para escribir en él (write())
  • de alguna forma, para leer en él (read())
  • alguna manera de reposicionar dentro de él (lseek())

Ciertos detalles de la biblioteca son opcionales, con la norma meramente ofrece a ser implementado en una forma estándar, pero no de hacer una aplicación de un requisito.

  • El time() función puede legalmente acaba de regresar (time_t)-1 si no el tiempo de mantenimiento de la mecánica están disponibles.

  • Los manejadores de señales descritas para <signal.h> no necesita ser invocado por cualquier otra cosa que una llamada a raise(), no hay ningún requisito de que el sistema lo envía algo como SIGSEGV a la aplicación.

  • El C11 encabezado <threads.h>, que es (por razones obvias), muy dependiente en el sistema operativo, no tiene que ser en todo caso de la aplicación define __STDC_NO_THREADS__...

Hay más ejemplos, pero no los tengo a mano ahora mismo.

El resto de la biblioteca puede ser implementado sin ninguna ayuda del medio ambiente.(*)


(*)Aclaración: El PDCLib la aplicación todavía no está completo, por lo que podría haber pasado por alto una cosa o dos. ;-)

4voto

jdv Puntos 215

Estándar de C es en realidad definida por separado del entorno operativo. No se realiza ninguna suposición sobre un sistema operativo anfitrión de estar en el presente, y las partes que son dependientes del anfitrión se definen como tales.

Es decir, el C Estándar ya es bastante bare metal.

Por supuesto, los idiomas, las piezas que amo tanto, las bibliotecas, son a menudo donde el núcleo del lenguaje empuja a ese host específico de la materia. Por lo tanto, el típico "xxx-lib" compilador cruzado material encontrado muchos bare metal herramientas de la plataforma.

2voto

luchador Puntos 74

Cuando se utiliza metalicos, descubrir algunos no implementadas las dependencias y tener que ocuparse de ellos. Todas estas dependencias se acerca de la optimización del funcionamiento interno de acuerdo a su sistema de la personalidad. Por ejemplo, cuando traté de usar sprintf (), que usa malloc() en el interior. Malloc ha "t_sbrk" símbolo de función como un gancho en el código, que tiene que ser implementado por el usuario para hacer cumplir el hardware consrains. Aquí me puede implementarlo, o hacer mi propia malloc() si, yo creo que podría hacer un mejor uno para el hardware embebido, principalmente para otros usos, no sólo sprintf.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X