libc de l'art intégré est une implémentation de bibliothèque standard C dépouillée ciblée pour les systèmes embarqués basés sur des microcontrôleurs.
Afin de conserver des ressources de mémoire précieuses, cette bibliothèque ne fournit pas l'implémentation complète de la bibliothèque standard C. Au lieu de cela, un sous-ensemble de fonctions utile sur les systèmes embarqués à métal nu a été sélectionné. Si vous avez un système embarqué basé sur du métal nu ou des RTOS, cette bibliothèque est pour vous!
Contrairement à de nombreuses autres bibliothèques C que j'ai rencontrées, cette bibliothèque implémente des tests unitaires et a abordé des défauts de longue date dans les implémentations open source des fonctions de bibliothèque standard C. Nous ajoutons continuellement des tests et apportons des améliorations supplémentaires par rapport aux implémentations de référence.
malloc et free ne sont pas inclus dans cette bibliothèque. Si vous avez besoin d'un support d'allocation de mémoire dynamique, vous devrez associer cette bibliothèque avec quelque chose comme libmemory d'art intégré, qui contient des implémentations de malloc et free .
Si vous souhaitez contribuer à ce projet, veuillez lire le guide CONTRIBUTING .
libc de l'art intégré est destiné à fournir un ensemble portable de fonctions de bibliothèque standard C utiles qui permettent un abonnement rapide de nouveaux systèmes embarqués à métal nu et basés sur RTOS.
De plus, nous voulons fournir une implémentation libc de haute qualité en garantissant que chaque fonction a une couverture de test unitaire et traite des défauts exposés par l'analyseur statique. De nombreuses implémentations de la fonction de bibliothèque C restent non testées et contiennent des erreurs. Nous nous battons contre les mauvaises implémentations.
Afin de conserver la mémoire, cette bibliothèque ne fournit pas la fonctionnalité complète de la bibliothèque standard. Au lieu de cela, un sous-ensemble de fonctions utile sur les systèmes embarqués à métal nu a été sélectionné. Cette sélection a été principalement motivée par ma propre expérience dans le développement axé sur le microcontrôleur. Si vous avez besoin de fonctionnalités supplémentaires, veuillez déposer un problème et faire une demande de fonctionnalité.
Les implémentations fonctionnelles de cette bibliothèque ont été sélectionnées pour la portabilité et l'apport rapide de nouveaux systèmes. Il peut y avoir des implémentations plus efficaces pour ces fonctions, mais ce sont souvent des implémentations spécifiques à l'architecture. Si vous avez des suggestions pour améliorer les performances, nous sommes toujours heureux de les entendre.
malloc et free ne sont pas inclus dans cette bibliothèque. Étant donné que les schémas d'allocation de mémoire varient considérablement avec les systèmes intégrés (certains n'autorisent même pas la mémoire dynamique), vous devrez fournir vos propres implémentations en fonction des besoins de votre système. Vous pouvez associer cette bibliothèque avec le libmemory artistique intégré, qui contient des implémentations de malloc et free .
Cette bibliothèque fournit une implémentation suffisante pour compiler et lier libc++ de Clang et libc++abi (voir le projet LIBCPP de l'art embarqué). Pour y parvenir, certaines fonctions ne sont définies que dans les en-têtes mais n'ont pas d'implémentation. Les fonctions non supportées mais définies peuvent être supprimées à l'aide d'une option de construction ( hide-unimplemented-libc-apis ).
Les parties suivantes de la bibliothèque C ont été implémentées:
assertcrt.c , exit , atexit , etc.)atoXabs , labs , llabsbsearchcallocdiv , ldiv , lldivheapsort , heapsort_rimaxabs , imaxdivqsort , qsort_rrandreallocstrtoX (beaucoup via gdtoa )printf Family (la plupart via embeddedartistry/printf , basé sur eyalroz/printf et à l'origine mpaland/printf )putcharputstime et asctime()wchar et fonctions wctype De plus, cette bibliothèque fournit des implémentations pour __stack_chk_guard et __stack_chk_fail .
Les architectures suivantes sont actuellement prises en charge:
Les tests unitaires suivants doivent être ajoutés:
reallocrandCeux-ci ne sont pas mis en œuvre par peuvent être ajoutés à l'avenir:
wcharerrno (activée en tant que commutateur de compilation)getopttimeFILE et fonctions STDIO supplémentairesNous ne planifions actuellement pas le soutien complet pour:
localeCe projet utilise le système de construction de Meson Standard Meson de Tirmy, et les dépendances sont décrites en détail sur notre site Web.
Au minimum, vous aurez besoin:
git-lfs , qui est utilisé pour stocker des fichiers binaires dans ce référentiel Ce projet stocke certains fichiers à l'aide de git-lfs .
Pour installer git-lfs sur Linux:
sudo apt install git-lfs
Pour installer git-lfs sur macOS:
brew install git-lfs
Des instructions d'installation supplémentaires peuvent être trouvées sur le site Web git-lfs .
Le système de construction Meson dépend de python3 et ninja-build .
Pour installer sur Linux:
sudo apt-get install python3 python3-pip ninja-build
Pour installer sur OSX:
brew install python3 ninja
Meson peut être installé via pip3 :
pip3 install meson
Si vous souhaitez installer Meson à l'échelle mondiale sur Linux, utilisez:
sudo -H pip3 install meson
Ce projet utilise git-lfs , veuillez donc l'installer avant le clonage. Si vous avez cloné avant d'installer git-lfs , exécutez simplement git lfs pull après l'installation.
Ce projet est hébergé sur GitHub. Vous pouvez cloner le projet directement en utilisant cette commande:
git clone --recursive [email protected]:embeddedartistry/libc.git
Si vous ne clonez pas récursivement, assurez-vous d'exécuter la commande suivante dans le référentiel ou votre build échouera:
git submodule update --init
Si la marque est installée, la bibliothèque peut être construite en émettant la commande suivante:
make
Cela créera toutes les cibles pour votre architecture actuelle.
Vous pouvez nettoyer les versions en utilisant:
make clean
Vous pouvez éliminer le dossier généré buildresults en utilisant:
make distclean
Vous pouvez également utiliser meson directement pour la compilation.
Créez un dossier de sortie de build:
meson buildresults
Et construire toutes les cibles en fonctionnant
ninja -C buildresults
La compilation croisée est gérée à l'aide de fichiers Cross meson . Des exemples de fichiers sont inclus dans le dossier build/cross . Vous pouvez rédiger vos propres fichiers croisés pour votre processeur spécifique en définissant la chaîne d'outils, les drapeaux de compilation et les drapeaux de liaison. Ces paramètres seront utilisés pour compiler libc . (ou ouvrir un problème et nous pouvons vous aider).
La compilation croisée doit être configurée à l'aide de la commande Meson lors de la création du dossier de sortie de build. Par exemple:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
Après cela, vous pouvez exécuter make (sur la racine du projet) ou ninja pour construire le projet.
Les tests ne seront pas compilés croisés. Ils ne seront construits que pour la plate-forme native.
Les instructions complètes pour la construction du projet, l'utilisation de chaînes d'outils alternatives et les outils de support de course sont documentées dans le système de construction de Meson standardisé de l'art embarqué sur notre site Web.
Le code indépendant de position (PIC) est activé par défaut, mais peut être désactivé pendant l'étape de configuration de Meson en définissant l'option intégrée b_staticpic à false :
meson buildresults -Db_staticpic=false
L'optimisation du temps de liaison (LTO) peut être activée pendant l'étape de configuration de Meson en définissant l'option intégrée b_lto sur true :
meson buildresults -Db_lto=true
Cela peut être combiné avec d'autres options de construction.
Si vous n'utilisez pas meson pour votre projet, la meilleure méthode pour utiliser ce projet est de la construire séparément et de copier les en-têtes et le contenu de la bibliothèque dans votre arborescence source.
include/ répertoire dans votre arborescence source.buildresults/srcExemple de drapeaux de liaison:
-Lpath/to/libc.a -lc
Si vous utilisez meson , vous pouvez utiliser libc comme sous-projet. Placez-le dans votre répertoire de sous-projection de choix et ajoutez une instruction subproject :
libc = subproject('libc')
Vous devrez promouvoir la variable de dépendance de sous-projet souhaitée à votre projet:
libc_dep = libc.get_variable('libc_dep')
Vous pouvez utiliser la dépendance de votre configuration de bibliothèque cible dans vos déclarations executable ou d'autres dépendances. Par exemple:
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'),
)
Les tests pour cette bibliothèque sont écrits avec CMocka, qui est inclus comme sous-projet et n'a pas besoin d'être installé sur votre système. Vous pouvez exécuter les tests en émettant la commande suivante:
make test
Par défaut, les résultats des tests sont générés pour une utilisation par le serveur CI et sont formatés dans JUnit XML. Les fichiers XML des résultats du test peuvent être trouvés dans buildresults/test/ .
Les options de projet Meson suivantes peuvent être définies pour cette bibliothèque lors de la création du répertoire des résultats de build avec meson , ou en utilisant meson configure :
enable-pedantic : activer les avertissements pedanticenable-pedantic-error : activer les avertissements et les erreurs pedantichide-unimplemented-libc-apis : cache les définitions d'en-tête des fonctions qui ne sont pas réellement implémentéesenable-gnu-extensions permettra les extensions GNU LIBC qui sont implémentées dans cette bibliothèquedisable-builtins dira au compilateur de ne pas générer de fonctions intégrées, la forçant à utiliser les fonctions de la bibliothèquedisable-stack-protection indiquera au compilateur de ne pas insérer les appels de protection de la pilestack-canary-value vous permet de personnaliser la valeur canari pour votre application. Fournissez une chaîne hexadécimale (par exemple, '0xdeadbeef' ) avec la même longueur que la taille des mots de votre processeur.disable-stk-guard-runtime-config désactive le code utilisé pour configurer __stk_chk_guard lors de l'initialisation du programme. Lorsque cette option est true , le programme reviendra à l'utilisation d'une définition codée dure pour la valeur de la garde. Les options peuvent être spécifiées à l'aide -D et du nom de l'option:
meson buildresults -Ddisable-builtins=false
Le même style fonctionne avec meson configure :
cd buildresults
meson configure -Ddisable-builtins=false
Cette bibliothèque fournit une implémentation de __stack_chk_guard et __stack_chk_fail , qui lui permet d'être utilisée avec le code de protection de la pile de GCC et de Clang.
La valeur par défaut pour __stack_chk_guard peut être remplacée avec l'option de création de stack-canary-value .
[La documentation pour la dernière version peut toujours être trouvée ici] https://embeddedarsty.github.io/libc/index.html.
La documentation peut être construite localement en exécutant la commande suivante:
make docs
La documentation peut être trouvée dans buildresults/docs , et la page racine est index.html .
Si vous avez besoin d'une aide supplémentaire ou si vous avez des questions, veuillez déposer un problème GitHub ou nous envoyer un e-mail à l'aide du formulaire de contact artistique intégré.
Vous pouvez également tendre la main sur Twitter: Mbeddedartistry.
Si vous souhaitez contribuer à ce projet, veuillez lire nos directives contributives.
Copyright © 2022 Embedded Artisther LLC
Ce projet est autorisé en vertu de la licence MIT - voir le fichier de licence pour plus de détails.
Pour d'autres licences open source, veuillez consulter l'inventaire du logiciel.
Je remercie les personnes suivantes pour leurs contributions directes sur ce projet:
printf )printf de Mpaland et le développement continu)De nombreuses implémentations de fonctions open source utilisées dans cette bibliothèque ont été retirées de deux sources primaires:
J'ai également utilisé et amélioré la bibliothèque gdtoa open source.
Les bases initiaux des tests ont été mises en œuvre en faisant référence au projet de test LIBC.
Retour en haut