YAOS est un système d'exploitation intégré pour les appareils Internet des objets (IoT), en particulier pour un processeur à noyau unique sans virtualisation MMU. Il est conçu pour l'efficacité énergétique et le développement indépendant du matériel.
Reportez-vous au répertoire /Documentation pour plus d'informations telles que la compilation, le portage, les API, etc.
Tous les commentaires sont les bienvenus à [email protected] . Et faites-moi savoir si l'un d'entre vous est intéressé à porter un nouveau MCU afin que je puisse vous donner un coup de main.
git clone git://github.com/onkwon/yaos
Obtenez-en un d'ici si vous n'en avez pas encore installé. Ou vous pouvez le compiler à partir du code source en mettant plus d'efforts, ce qui n'est pas recommandé mais qui vaut toujours la peine d'essayer.
make clean
make stm32f1 (or specify your board. e.g. mango-z1)
make
make burn
Les planches soutenues pour le moment sont:
- Mango-Z1
- mycortex-stm32f4
- nrf52
- STM32F429I-DISCO
- STM32F469I-DISCO
- STM32-LCD
- UST-MPB-STM32F103
- STM32F1-MIN
En cas d'obtention de messages d'erreur quelque chose comme undefined reference to __aeabi_uidiv , spécifiez le chemin de la bibliothèque lorsque vous make dans le chemin ci-dessous:
make LD_LIBRARY_PATH=/usr/local/arm/lib/gcc/arm-none-eabi/4.9.2
Le chemin dépend de votre environnement de développement.
Permettez-moi de mettre un exemple de clignotement une LED pour que vous ayez un avant-goût de l'apparence du code.
Les tâches utilisateur seraient placées sous / tâches (par exemple, tâches / my-first task.c):
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);
Deux types de tâches sont gérés: les tâches normales et en temps réel. Planificateur à tournoyer pour les tâches normales tandis que le planificateur prioritaire pour les tâches en temps réel. Chaque tâche reçoit une priorité qui peut être modifiée dynamiquement avec set_task_pri() . Pour les tâches en temps réel, une tâche de priorité plus élevée préempte toujours des tâches de priorité plus faibles tandis que les mêmes tâches de priorité ont lieu à leur tour sous la planification de la ronde. Le planificateur peut être arrêté pour réduire même les frais généraux de planification en cas de tâche critique. D'un autre côté, les tâches normales ont la chance d'exécuter par un planificateur juste simplifié, qui choisit la valeur minimale de l'exécution pour la prochaine tâche à exécuter.
Les tâches sont toujours dans l'un des cinq États: courir, arrêter, attendre, dormir ou zombie. Et une tâche peut être créée à la fois statiquement et dynamiquement au moment de l'exécution.
La ressource système est accessible par l'interface d'appel système entrant en mode privilégié lorsqu'une tâche utilisateur s'exécute en mode utilisateur (non privilégié).
Le concept de système de fichiers virtuel (VFS) est implémenté. La ROM Flash intégrée dans SOC peut être montée sous forme de système de fichiers racine (ENGEDFS) tandis qu'un RAMFS est monté sous forme de DEVFS pour un nœud de périphérique.
La mémoire flash vide est enregistrée en tant qu'EmbedFS afin que l'utilisateur puisse l'utiliser comme un système de fichiers normal.
La page est une unité de gestion de la mémoire, mais le gestionnaire de mémoire alternatif peut être utilisé dans un tel système de pénurie de mémoire.
L'allocateur Buddy et l'allocateur de premier ajustement sont implémentés.
Softirqs préemptera tout travail, sauf la réponse à une véritable interruption car ils fonctionnent à une priorité élevée. En fait, Softirq n'est qu'une tâche de noyau qui fonctionne avec des interruptions activées et peut dormir, mais a la priorité la plus élevée parmi les tâches de course.
Primitives de synchronisation telles que le sémaphore, le spinlock, etc.