Ich portiere die Standard-C-Bibliothek für Bare-Metal-Betriebssysteme (ARM Cortex-M4, ARM GCC). Ich möchte Funktionen wie strlen, sprintf (und vielleicht eine Speicherzuweisung) usw. haben.
Ich habe PDCLib und Newlib portiert. Newlib ist nicht leicht (und versuchen Sie, Dateioperationen usw. zu implementieren). PDCLib befindet sich nicht in aktiver Entwicklung.
Also, ich will genau Microlib . Aber es ist nicht für GCC und Closed Source.
Gibt es hierfür Alternativen? Und gibt es einige "Bare-Metal-Teilmengen" der Standard-C-Bibliothek?
Wenn ich eine wirklich leichte (und/oder Thread-sichere) Bibliothek haben möchte, schreibe ich normalerweise meine eigene. Es ist nicht schwer zu tun.
Da Sie über einen "Speicherzuordner" sprechen, lassen Sie mich vorschlagen, dass ein malloc()/free-Paar trivial zu schreiben ist - vielleicht ein paar Dutzend Zeilen:
#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;
}
Sie initialisieren es auf folgende Weise. Richten Sie zunächst einen festen Speicherblock mit einer Standard-Array-Zuweisung wie dieser ein:
static char mspace[1000];
Das kann in ein Modul gesteckt werden, das Sie schreiben. Es sollte natürlich als statische Lebensdauer zugewiesen werden.
Dann machst du woanders (wie in main()) Folgendes:
((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 ist sehr schnell und sehr einfach.
strlen() ist natürlich viel einfacher und dafür finden Sie alle Arten von Implementierungen im Web.
Der Rest? Ich würde empfehlen, dass Sie diese auch schreiben. Ein sehr, sehr hilfreiches Buch hier ist "The Standard C Library" von PJ Plauger (einer der Gründer von Whitesmiths LTD - Compiler Company). Holen Sie sich einfach eine Kopie. Sie werden es nicht bereuen. Es deckt Dinge wie sprintf() für Sie ab, was viel komplizierter ist und möglicherweise die Behandlung mit Gleitkommawerten bei der Konvertierung für die Ausgabe beinhaltet. (Wenn Sie sprintf() neu erstellen, werden Sie als Ergebnis davon viel Code einschleppen – aber es wird nur benötigt, wenn Sie eine so leistungsstarke Bibliotheksfunktion wünschen.)
Sie sollten einen Blick auf musl werfen .
Es ist leicht und Open Source und für eingebettete Anwendungen vorgesehen.
Ich weiß nicht, ob das genau deinen Anforderungen entspricht.
Paulo Soares