YAOS ist ein eingebettetes Betriebssystem für Internet of Things (IoT), insbesondere für einen Einzelkernprozessor ohne MMU-Virtualisierung. Es ist für Energieeffizienz und hardwareunabhängige Entwicklung ausgelegt.
Weitere Informationen wie Kompilieren, Portierung, APIs usw. finden Sie im Verzeichnis /Documentation
Jedes Feedback ist herzlich an [email protected] willkommen. Und lassen Sie mich wissen, ob einer von Ihnen daran interessiert ist, auf eine neue MCU zu portieren, damit ich Ihnen Hand geben kann.
git clone git://github.com/onkwon/yaos
Holen Sie sich eine von hier, wenn Sie noch keine installiert haben. Oder Sie können es aus Quellcode kompilieren und mehr Mühe geben, was nicht empfohlen wird, aber dennoch es wert ist, es zu versuchen.
make clean
make stm32f1 (or specify your board. e.g. mango-z1)
make
make burn
Unterstützte Boards im Moment sind:
- Mango-Z1
- mycortex-stm32f4
- Nrf52
- STM32F429I-DISCO
- STM32F469I-DISCO
- STM32-LCD
- Ust-MPB-STM32F103
- STM32F1-min
Wenn Sie bei Fehlermeldungen etwas wie undefined reference to __aeabi_uidiv erhalten, geben Sie den Bibliothekspfad an, wenn Sie unten in der folgenden Weise make :
make LD_LIBRARY_PATH=/usr/local/arm/lib/gcc/arm-none-eabi/4.9.2
Der Weg ist von Ihrer Entwicklungsumgebung abhängig.
Lassen Sie mich ein Beispiel dafür geben, eine LED zu blinken, damit Sie einen Vorgeschmack darauf nehmen, wie der Code aussieht.
Benutzeraufgaben würden unter /Aufgaben (z. B. Aufgaben /My-First-Task.c) platziert:
void main()
{
int fd, led = 0;
if ((fd = open("/dev/gpio20", O_WRONLY)) <= 0) {
printf("can not open, %xn", fd);
return;
}
while (1) {
write(fd, &led, 1);
led ^= 1;
sleep(1);
}
close(fd);
}
REGISTER_TASK(main, 0, DEFAULT_PRIORITY, STACK_SIZE_DEFAULT);
Zwei Arten von Aufgaben werden behandelt: Normale und Echtzeitaufgaben. Round-Robin-Scheduler für normale Aufgaben, während Priority Scheduler für Echtzeitaufgaben. Jede Aufgabe hat eine Priorität, die mit set_task_pri() dynamisch geändert werden kann. Bei Echtzeitaufgaben gibt es eine höhere Prioritätsaufgabe immer niedrigere Prioritätsaufgaben, während die gleichen Prioritätsaufgaben wiederum unter Round-Robin-Planung erfolgen. Scheduler kann gestoppt werden, um selbst den Planungsaufwand im Falle einer zeitkritischen Aufgabe zu reduzieren. Andererseits erhalten normale Aufgaben die Chance, mit einem vereinfachten Fair -Scheduler auszuführen, der den Mindestwert der Laufzeit für die nächste Aufgabe ausnimmt.
Aufgaben erfolgen immer in einem von fünf Staaten: Laufen, Stopp, Warten, Schlafen oder Zombie. Und eine Aufgabe kann sowohl statisch als auch dynamisch zur Laufzeit erstellt werden.
Auf die Systemressource wird von der System Call -Schnittstelle zugegriffen, die den berechtigten Modus eingibt, während eine Benutzeraufgabe im Benutzer (unrivikten) Modus ausgeführt wird.
Das Konzept des virtuellen Dateisystems (VFS) wird implementiert. Das eingebettete Flash -ROM in SOC kann als Root -Dateisystem (EMBIDFS) montiert werden, während ein RAMFS als DevFS für einen Geräteknoten montiert wird.
Der leere Flash -Speicher wird als Einbettfleisch registriert, sodass der Benutzer ihn genau wie ein normales Dateisystem verwenden kann.
Page ist Einheit des Speichermanagements, aber alternativer Speichermanager kann in einem solchen Speichersystem verwendet werden.
Buddy Allocator und First-Fit-Allocator werden implementiert.
Softirqs wird alle Arbeiten außer der Reaktion auf einen realen Interrupt vorbeugen, wenn sie mit hoher Priorität laufen. Tatsächlich ist Softirq nur eine Kernel -Aufgabe, die mit aktivierten Interrupts ausgeführt wird und kann schlafen, hat jedoch die höchste Priorität bei laufenden Aufgaben.
Synchronisation Primitive wie Semaphor, Spinlock usw.