Приклад мінімальної експлуатації Newlib
Тут я надаю високо автоматизований і задокументований приклад, який показує новоліб в дії в QEMU .
За допомогою newlib ви реалізуєте власні системні виклики для своєї бареметальної платформи.
Наприклад, на наведеному вище прикладі ми маємо приклад програми exit.c
:
#include <stdio.h>
#include <stdlib.h>
void main(void) {
exit(0);
}
і в окремому файлі C common.c
, ми будемо виконувати exit
з ARM semihosting :
void _exit(int status) {
__asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
}
Інші типові систематичні виклики, які ви будете реалізовувати, це:
write
для виведення результатів на хост. Це можна зробити за допомогою:
- більше напівгості
- обладнання UART
brk
для malloc
.
Легко на бареметалі, оскільки нам не потрібно піклуватися про пейджинг!
TODO Цікаво, чи реально досягти випереджувального планування виконання системних дзвінків, не потрапляючи в повноцінний RTOS, такий як Zephyr або FreeRTOS .
Класна річ у Newlib - це те, що він реалізує всі конкретні речі, не для ОС, як string.h
для вас, і дозволяє реалізовувати лише заглушки ОС.
Крім того, вам не доведеться реалізувати всі заглушки, а лише ті, які вам знадобляться. Наприклад, якщо вашій програмі потрібно лише exit
, вам не потрібно надавати print
.
Дерево джерела Newlib вже має деякі реалізації, включаючи реалізацію напівгостингу ARM під newlib/libc/sys/arm
, але здебільшого вам доведеться реалізувати власну. Однак це дає надійну базу для виконання завдання.
Найпростіший спосіб налаштувати Newlib - це створити власний компілятор з crosstool-NG, вам просто потрібно сказати йому, що ви хочете використовувати Newlib як бібліотеку C. Моя установка автоматично обробляє для вас цей сценарій , який використовує конфігурації newlib, наявні в crosstool_ng_config
.
Я думаю, що C ++ також буде працювати, але TODO перевірить це.