Esempio eseguibile minimo di Newlib
Qui fornisco un esempio altamente automatizzato e documentato che mostra newlib in azione in QEMU .
Con newlib, implementate le vostre chiamate di sistema per la vostra piattaforma baremetal.
Ad esempio, nell'esempio sopra, abbiamo un programma di esempio exit.c
:
#include <stdio.h>
#include <stdlib.h>
void main(void) {
exit(0);
}
e in un file C separato common.c
, implementiamo il semihostingexit
con ARM :
void _exit(int status) {
__asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
}
Le altre tipiche syscalls che implementerai sono:
write
per produrre risultati sull'host. Questo può essere fatto con:
- più semihosting
- un hardware UART
brk
per malloc
.
Facile su baremetal, dal momento che non dobbiamo preoccuparci del paging!
TODO Mi chiedo se sia realistico raggiungere l'esecuzione preventiva di syscall di programmazione senza entrare in un RTOS completo come Zephyr o FreeRTOS .
La cosa bella di Newlib è che implementa tutte le cose non specifiche del SO string.h
te e ti consente di implementare solo gli stub del sistema operativo.
Inoltre, non devi implementare tutti gli stub, ma solo quelli di cui avrai bisogno. Ad esempio, se il tuo programma ha solo bisogno exit
, non devi fornire un print
.
L'albero dei sorgenti di Newlib ha già alcune implementazioni, inclusa un'implementazione di semihosting ARM sotto newlib/libc/sys/arm
, ma per la maggior parte devi implementare la tua. Fornisce tuttavia una solida base per l'attività.
Il modo più semplice per installare Newlib è costruire il tuo compilatore con crosstool-NG, devi solo dirgli che vuoi usare Newlib come libreria C. La mia configurazione lo gestisce automaticamente per te con questo script , che utilizza le nuove configurazioni conf. Presenti incrosstool_ng_config
.
Penso che anche C ++ funzionerà, ma TODO lo prova.