Newlib contoh runnable minimal
Di sini saya memberikan contoh yang sangat otomatis dan terdokumentasi yang menunjukkan tindakan newlib dalam QEMU .
Dengan newlib, Anda menerapkan panggilan sistem Anda sendiri untuk platform baremetal Anda.
Sebagai contoh, pada contoh di atas, kami memiliki contoh program exit.c
:
#include <stdio.h>
#include <stdlib.h>
void main(void) {
exit(0);
}
dan dalam file C yang terpisah common.c
, kami menerapkan exit
dengan semihosting ARM :
void _exit(int status) {
__asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
}
Syscalls khas lainnya yang akan Anda terapkan adalah:
write
untuk menampilkan hasil ke host. Ini dapat dilakukan dengan:
- lebih semihosting
- perangkat keras UART
brk
untuk malloc
.
Mudah digunakan di baremetal, karena kita tidak perlu peduli tentang paging!
TODO Saya bertanya-tanya apakah realistis untuk mencapai eksekusi syscalls penjadwalan preemptive tanpa pergi ke RTOS penuh sesak seperti Zephyr atau FreeRTOS .
Hal keren tentang Newlib, adalah mengimplementasikan semua hal non-OS spesifik seperti string.h
untuk Anda, dan memungkinkan Anda menerapkan hanya OS bertopik.
Juga, Anda tidak harus menerapkan semua bertopik, tetapi hanya yang Anda butuhkan. Misalnya, jika program Anda hanya perlu exit
, maka Anda tidak perlu menyediakanprint
.
Pohon sumber Newlib memang sudah memiliki beberapa implementasi, termasuk implementasi semihosting ARM di bawah newlib/libc/sys/arm
, tetapi sebagian besar Anda harus mengimplementasikan sendiri. Namun itu memberikan dasar yang kuat untuk tugas tersebut.
Cara termudah untuk men-setup Newlib adalah dengan membangun compiler Anda sendiri dengan crosstool-NG, Anda hanya perlu mengatakan bahwa Anda ingin menggunakan Newlib sebagai pustaka C. Setup saya menangani itu secara otomatis untuk Anda dengan skrip ini , yang menggunakan konfigurasi lib baru hadir dicrosstool_ng_config
.
Saya pikir C ++ juga akan berfungsi, tetapi TODO mengujinya.