4 votos

Peso ligero (subconjunto) de la biblioteca C estándar (ANSI C biblioteca)

Yo soy de la portabilidad de la biblioteca estándar de C para bare metal "OS" (ARM Cortex-M4, ARM GCC). Quiero tener funciones como strlen, sprintf, (y asignador de memoria, tal vez), etc.

Me he portado PDCLib y Newlib. Newlib no es ligero (y tratar de implementar los archivos de operaciones, etc.). PDCLib no está en desarrollo activo.

Por lo tanto, quiero Microlib exactamente. Pero no es para GCC y de código cerrado.

Existen algunas alternativas para esto? Y hay algunos "bare metal subconjuntos" de de la biblioteca estándar de C?

10voto

AitorTheRed Puntos 241

Cuando quiero un verdadero peso ligero (y/o una que es thread-safe) de la biblioteca que suelo escribir mi propia. No es difícil de hacer.

Ya se habla de un "asignador de memoria," permítanme sugerir que un malloc()/par es trivial para escribir, quizás una docena de líneas:

#define STATUSFREE 0
#define STATUSUSED 1
struct tag {
    struct tag * next;
    int status;
};
struct tag * heap;
void free( void * p ) {
    struct tag * ptag= ((struct tag *)p) - 1;
        ptag->status= STATUSFREE;
}
void * malloc( size_t s ) {
    struct tag *ptag, *pnext;
        for ( ptag= heap; ptag != NULL; ptag= ptag->next )
            if (ptag->status == STATUSFREE) {
                for ( pnext= ptag->next; pnext->status == STATUSFREE; pnext= pnext->next )
                    ;
                if ( s <= (size_t) (((char *) pnext) - (char *) (ptag+1)) ) {
                    if ( s <= (size_t) (((char *) pnext) - (char *) (ptag+2)) ) {
                        ptag->next= (struct tag *) (s + (char *) (ptag+1));
                        ptag->next->status= STATUSFREE;
                        ptag->next->next= pnext;
                    } else
                        ptag->next= pnext;
                    ptag->status= STATUSUSED;
                    return ptag+1;
                }
                ptag->next= pnext;
            }
    return NULL;
}

Inicializar la siguiente forma. En primer lugar, establecer un bloque fijo de la memoria utilizando un estándar de la matriz de asignación de como esta:

static char mspace[1000];

Que puede ser colocado en algún módulo de escribir. Debe ser asignado como estática de toda la vida, por supuesto.

Entonces, en algún otro lugar (como en main()), hacer lo siguiente:

((struct tag *) &mspace[0])->status= STATUSFREE;
((struct tag *) &mspace[0])->next= &((struct tag *) &mspace[sizeof(mspace)])[-1];
((struct tag *) &mspace[sizeof(mspace)])[-1].status= STATUSUSED;
((struct tag *) &mspace[sizeof(mspace)])[-1].next= NULL;
heap= (struct tag *) &mspace[0];

Es muy rápido y muy fácil.

la función strlen() es, por supuesto, mucho más fácil y usted puede encontrar toda la manera de la aplicación en la web para eso.

El resto? Me gustaría recomendar que se escribe también. Un libro muy útil aquí es P. J. Plauger (uno de los fundadores de Whitesmiths LTD -- compilador de la empresa) "La Biblioteca Estándar de c." Acaba de obtener una copia. Usted no se arrepentirá. Cubre cosas como sprintf() para usted, que es mucho más complicado y puede implicar el tratamiento con valores de punto flotante cuando la conversión para la salida. (Cuando vuelva a crear sprintf(), se va a transportar en un montón de código como resultado de que-pero es necesario si usted quiere una potente función de la biblioteca.)

0voto

Antonio Puntos 41

Usted debe echar un vistazo de musl.

Es ligero y de código abierto, y está destinado a aplicación incorporada.
No sé si esto exactamente sus necesidades.

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