Exemple exécutable minimal de Newlib
Ici, je fournis un exemple hautement automatisé et documenté qui montre newlib en action dans QEMU .
Avec newlib, vous implémentez vos propres appels système pour votre plateforme baremetal.
Par exemple, dans l'exemple ci-dessus, nous avons un exemple de programme exit.c
:
#include <stdio.h>
#include <stdlib.h>
void main(void) {
exit(0);
}
et dans un fichier C séparé common.c
, nous implémentons le exit
avec ARM semihosting :
void _exit(int status) {
__asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
}
Les autres appels système typiques que vous implémenterez sont:
write
pour afficher les résultats sur l'hôte. Cela peut être fait soit avec:
- plus semihosting
- un matériel UART
brk
pour malloc
.
Facile sur baremetal, car nous n'avons pas à nous soucier de la pagination!
TODO Je me demande s'il est réaliste d'atteindre l'exécution de syscalls de planification préemptive sans entrer dans un RTOS complet comme Zephyr ou FreeRTOS .
La chose intéressante à propos de Newlib, c'est qu'il implémente toutes les choses non spécifiques au système d'exploitation comme string.h
pour vous, et vous permet d'implémenter uniquement les talons du système d'exploitation.
De plus, vous n'avez pas à implémenter tous les stubs, mais seulement ceux dont vous aurez besoin. Par exemple, si votre programme a seulement besoin exit
, vous n'avez pas à fournir de print
.
L'arbre source de Newlib a déjà quelques implémentations, y compris une implémentation semi-hôte ARM sous newlib/libc/sys/arm
, mais pour la plupart, vous devez implémenter la vôtre. Il fournit cependant une base solide pour la tâche.
La façon la plus simple de configurer Newlib est de construire votre propre compilateur avec crosstool-NG, il vous suffit de lui dire que vous souhaitez utiliser Newlib comme bibliothèque C. Ma configuration gère cela automatiquement pour vous avec ce script , qui utilise les configurations newlib présentes sur crosstool_ng_config
.
Je pense que C ++ fonctionnera également, mais TODO le teste.