libc der Embedded Artistry ist eine abgespeckte C-Standardbibliothek-Implementierung, die für eingebettete Systeme auf Mikrocontroller basiert.
Um wertvolle Speicherressourcen zu erhalten, liefert diese Bibliothek die vollständige C -Standardbibliotheksimplementierung nicht. Stattdessen wurde eine Untergruppe von Funktionen ausgewählt, die bei bloßen Metall-eingebetteten Systemen nützlich sind. Wenn Sie ein bare Metall oder ein RTOS-basiertes eingebettetes System haben, ist diese Bibliothek genau das Richtige für Sie!
Im Gegensatz zu vielen anderen C-Bibliotheken, auf die ich gestoßen bin, implementiert diese Bibliothek Unit-Tests und hat langjährige Fehler in Open-Source-Implementierungen der C-Standardbibliotheksfunktionen angesprochen. Wir fügen kontinuierlich Tests hinzu und machen zusätzliche Verbesserungen gegenüber den Basisimplementierungen vor.
malloc und free sind in dieser Bibliothek nicht enthalten. Wenn Sie Unterstützung für dynamische Speicherzuweisung benötigen, müssen Sie diese Bibliothek mit so etwas wie libmemory von Embedded Artistry koppeln, das Implementierungen von malloc und free enthält.
Wenn Sie daran interessiert sind, zu diesem Projekt beizutragen, lesen Sie bitte den CONTRIBUTING Leitfaden.
libc der Embedded Artistry soll eine tragbare Reihe nützlicher C-Standardbibliotheksfunktionen bereitstellen, mit denen ein schnelles Eingebettungssystem für nackte und rTOS-basierte RTOS-Basis eingebaut werden kann.
Darüber hinaus möchten wir eine qualitativ hochwertige libc -Implementierung bereitstellen, indem wir sicherstellen, dass jede Funktion die Abdeckung der Unit-Tests enthält und sich mit Fehler befasst, die vom statischen Analysator ausgesetzt sind. Viele C -Bibliotheksfunktion Implementierungen bleiben nicht getestet und enthalten Fehler. Wir wehren uns gegen schlechte Implementierungen.
Um den Speicher zu sparen, liefert diese Bibliothek nicht die vollständige C -Standardbibliotheksfunktion. Stattdessen wurde eine Untergruppe von Funktionen ausgewählt, die bei bloßen Metall-eingebetteten Systemen nützlich sind. Diese Auswahl wurde in erster Linie von meiner eigenen Erfahrung in der Entwicklung von Mikrocontroller-fokussierten Entwicklung angetrieben. Wenn Sie zusätzliche Funktionen benötigen, stellen Sie bitte ein Problem ein und stellen Sie eine Funktionsanforderung vor.
Die funktionalen Implementierungen in dieser Bibliothek wurden für die Portabilität und das schnelle Aufnehmen neuer Systeme ausgewählt. Für diese Funktionen können effizientere Implementierungen vorhanden sein, aber häufig sind sie architekturspezifische Implementierungen. Wenn Sie Vorschläge zur Verbesserung der Leistung haben, freuen wir uns immer, sie zu hören.
malloc und free sind in dieser Bibliothek nicht enthalten. Da die Speicherzuweisungsschemata stark je nach eingebetteten Systemen variieren (einige nicht einmal zulässt dynamischem Speicher), müssen Sie Ihre eigenen Implementierungen basierend auf den Anforderungen Ihres Systems liefern. Sie können diese Bibliothek mit dem eingebetteten libmemory koppeln, das Implementierungen von malloc und free enthält.
Diese Bibliothek bietet eine vollständige Implementierung, um libc++ und libc++abi von Clang von Clang zu kompilieren und zu verknüpfen (siehe LIBCPP-Projekt der Embedded Artistry). Um dies zu erreichen, sind einige Funktionen nur in den Headern definiert, haben jedoch keine Implementierung. Nicht unterstützte, aber definierte Funktionen können unter Verwendung einer Build-Option ( hide-unimplemented-libc-apis ) entfernt werden.
Die folgenden Teile der C -Bibliothek wurden implementiert:
assertcrt.c , exit , atexit usw.)atoXabs , labs , llabsbsearchcallocdiv , ldiv , lldivheapsort , heapsort_rimaxabs , imaxdivqsort , qsort_rrand FamiliereallocstrtoX -Funktionen (viele über gdtoa )printf mpaland/printf embeddedartistry/printf eyalroz/printfputcharputstime und asctime()wchar -Typdefinitionen und wctype -Funktionen Zusätzlich enthält diese Bibliothek Implementierungen für __stack_chk_guard und __stack_chk_fail .
Die folgenden Architekturen werden derzeit unterstützt:
Die folgenden Unit -Tests müssen hinzugefügt werden:
reallocrand FamilieDiese werden nicht in Zukunft hinzugefügt werden:
wchar -Funktionenerrno Support (als Kompilierungszeitschalter aktiviert)getopt -UnterstützungtimeFILE und zusätzliche STDIO -FunktionenWir planen derzeit keine vollständige Unterstützung für:
localeDieses Projekt verwendet das Standard -Meson -Build -System der Embedded Artistry, und auf unserer Website werden Abhängigkeiten ausführlich beschrieben.
Zumindest benötigen Sie:
git-lfs , mit dem Binärdateien in diesem Repository gespeichert werden Dieses Projekt speichert einige Dateien mit git-lfs .
So installieren Sie git-lfs unter Linux:
sudo apt install git-lfs
So installieren Sie git-lfs auf macOS:
brew install git-lfs
Weitere Installationsanweisungen finden Sie auf der git-lfs -Website.
Das Meson-Build-System hängt von python3 und ninja-build ab.
So installieren Sie unter Linux:
sudo apt-get install python3 python3-pip ninja-build
So installieren Sie unter OSX:
brew install python3 ninja
Meson kann über pip3 installiert werden:
pip3 install meson
Wenn Sie Meson weltweit unter Linux installieren möchten, verwenden Sie:
sudo -H pip3 install meson
Dieses Projekt verwendet git-lfs . Installieren Sie es daher vor dem Klonen. Wenn Sie vor der Installation git-lfs kloniert haben, führen Sie einfach git lfs pull .
Dieses Projekt wird auf GitHub gehostet. Sie können das Projekt mit diesem Befehl direkt klonen:
git clone --recursive [email protected]:embeddedartistry/libc.git
Wenn Sie nicht rekursiv klonen, stellen Sie sicher, dass Sie den folgenden Befehl im Repository ausführen oder Ihr Build fällt fehl:
git submodule update --init
Wenn die Marke installiert ist, kann die Bibliothek durch Ausgabe des folgenden Befehls erstellt werden:
make
Dadurch werden alle Ziele für Ihre aktuelle Architektur erstellt.
Sie können Builds mit:
make clean
Sie können den erzeugten buildresults -Ordner mit:
make distclean
Sie können meson auch direkt zum Kompilieren verwenden.
Erstellen Sie einen Build -Ausgangsordner:
meson buildresults
Und bauen Sie alle Ziele durch Laufen auf
ninja -C buildresults
Cross-Compilation wird mit meson Cross-Dateien behandelt. Beispieldateien sind im build/cross -Ordner enthalten. Sie können Ihre eigenen Kreuzdateien für Ihren spezifischen Prozessor schreiben, indem Sie die Toolchain-, Kompilierungsflags und Linker -Flags definieren. Diese Einstellungen werden verwendet, um libc zu kompilieren. (oder öffnen Sie ein Problem und wir können Ihnen helfen).
Die Kreuzkompilierung muss mit dem Befehl meson konfiguriert werden, wenn der Build-Ausgangsordner erstellt wird. Zum Beispiel:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
Anschließend können Sie make (bei der Projektwurzel) oder ninja ausführen, um das Projekt zu erstellen.
Tests werden nicht überschritten. Sie werden nur für die native Plattform gebaut.
Vollständige Anweisungen zum Erstellen des Projekts, die Verwendung alternativer Toolchains und das Ausführen von Support -Tools sind im standardisierten Meson Build -System der Embedded Artistry auf unserer Website dokumentiert.
Der Positions-Independent-Code (PIC) ist standardmäßig aktiviert, kann jedoch während der Meson-Konfigurationsphase deaktiviert werden, indem die integrierte Option b_staticpic auf false festgelegt wird:
meson buildresults -Db_staticpic=false
Die Link-Time-Optimierung (LTO) kann während der Meson-Konfigurationsphase aktiviert werden, indem die integrierte Option b_lto auf true festgelegt wird:
meson buildresults -Db_lto=true
Dies kann mit anderen Build -Optionen kombiniert werden.
Wenn Sie meson für Ihr Projekt nicht verwenden, besteht die beste Methode, um dieses Projekt zu verwenden, es ist, es separat zu erstellen und die Header- und Bibliotheksinhalte in Ihren Quellbaum zu kopieren.
include/ Verzeichnisinhalt in Ihren Quellbaum.buildresults/src gespeichertBeispiel Linker Flags:
-Lpath/to/libc.a -lc
Wenn Sie meson verwenden, können Sie libc als Unterprojekt verwenden. Platzieren Sie es in Ihr Subproject -Verzeichnis der Wahl und fügen Sie eine subproject -Anweisung hinzu:
libc = subproject('libc')
Sie müssen die gewünschte Subproject -Abhängigkeitsvariable für Ihr Projekt fördern:
libc_dep = libc.get_variable('libc_dep')
Sie können die Abhängigkeit für Ihre Zielbibliothekskonfiguration in Ihren executable Deklarationen oder anderen Abhängigkeiten verwenden. Zum Beispiel:
fwdemo_sim_platform_dep = declare_dependency(
include_directories: fwdemo_sim_platform_inc,
dependencies: [
fwdemo_simulator_hw_platform_dep,
posix_os_dep,
libmemory_native_dep,
libc_dep, # <----- libc added here
libcxxabi_native_dep,
libcxx_full_native_dep,
logging_subsystem_dep
],
sources: files('platform.cpp'),
)
Die Tests für diese Bibliothek sind mit CMOCKA geschrieben, die als Unterprojekt enthalten sind und nicht auf Ihrem System installiert werden müssen. Sie können die Tests ausführen, indem Sie den folgenden Befehl ausgeben:
make test
Standardmäßig werden Testergebnisse für die Verwendung vom CI -Server generiert und in Junit XML formatiert. Die Testergebnisse XML -Dateien finden Sie in buildresults/test/ .
Die folgenden Meson -Projektoptionen können für diese Bibliothek festgelegt werden, wenn das Erstellungsergebnisverzeichnis mit meson erstellt oder mit meson configure verwendet wird:
enable-pedantic : pedantic Warnungen einschaltenenable-pedantic-error : Schalten Sie pedantic Warnungen und Fehler einhide-unimplemented-libc-apis : verbirgt die Header-Definitionen für Funktionen, die nicht tatsächlich implementiert werdenenable-gnu-extensions ermöglichen die in dieser Bibliothek implementierten GNU-LIBC-Erweiterungen, die implementiert sinddisable-builtins werden dem Compiler sagendisable-stack-protection werden dem Compiler mitteilen, dass er keine Stapelschutzaufrufe einfügtstack-canary-value können Sie den Kanarischen Wert für Ihre Anwendung anpassen. Liefern Sie eine Hexadezimalzeichenfolge (z. B. '0xdeadbeef' ) mit der gleichen Länge wie die Wortgröße Ihres Prozessors.disable-stk-guard-runtime-config deaktiviert den Code, mit dem __stk_chk_guard während der Programminitialisierung konfiguriert wird. Wenn diese Option true ist, wird das Programm zur Verwendung einer hart codierten Definition für den Wachwert zurückgeführt. Optionen können mit -D und den Optionsnamen angegeben werden:
meson buildresults -Ddisable-builtins=false
Der gleiche Stil funktioniert mit meson configure :
cd buildresults
meson configure -Ddisable-builtins=false
Diese Bibliothek bietet eine Implementierung von __stack_chk_guard und __stack_chk_fail , mit der sie mit GCC und Clang's Stack Protection Code verwendet werden kann.
Der Standardwert für __stack_chk_guard kann mit der Option stack-canary-value überschrieben werden.
[Dokumentation für die neueste Veröffentlichung kann immer hier gefunden werden] https://embeddedartistry.github.io/libc/index.html.
Die Dokumentation kann lokal erstellt werden, indem der folgende Befehl ausgeführt wird:
make docs
Die Dokumentation finden Sie in buildresults/docs , und die Stammseite ist index.html .
Wenn Sie weitere Hilfe benötigen oder Fragen haben, stellen Sie bitte ein GitHub -Problem ein oder senden Sie uns eine E -Mail mit dem Eingebett -Kunstkontaktformular.
Sie können auch auf Twitter: mbededArtistry angreifen.
Wenn Sie daran interessiert sind, zu diesem Projekt beizutragen, lesen Sie bitte unsere beitragenden Richtlinien.
Copyright © 2022 Embedded Artistry LLC
Dieses Projekt ist unter der MIT -Lizenz lizenziert - Einzelheiten finden Sie in Lizenzdatei.
Weitere Open-Source-Lizenzen finden Sie im Software-Inventar.
Ich möchte den folgenden Personen für ihre direkten Beiträge zu diesem Projekt danken:
printf -Bibliothek)printf -Bibliothek und Fortsetzung der Entwicklung)Viele der in dieser Bibliothek verwendeten Open-Source-Funktionsinformationen wurden aus zwei Hauptquellen gezogen:
Ich habe auch die Open-Source gdtoa Bibliothek benutzt und verbessert.
Die anfängliche Prüfung des Tests wurde durch Bezugnahme auf das LIBC-Testprojekt implementiert.
Zurück nach oben