Clause de non-responsabilité. L'auteur ne préconise pas l'utilisation de systèmes d'exploitation multitâche pour les microcontrôleurs.
La vie force sans pitié l'utilisation de systèmes d'exploitation (OS) pour les microcontrôleurs. Il existe un nombre immense de tels systèmes sur le marché. Les développeurs de systèmes d'exploitation, en concurrence les uns avec les autres, tentent de maximiser la fonctionnalité de leurs produits. Cela conduit souvent à une augmentation de la «lourdeur» du système, et augmente également de manière significative le «seuil d'entrée» pour un programmeur qui développe des logiciels pour les systèmes embarqués.
Afin de ne pas être tourmenté par le choix du système d'exploitation pour nos projets, ainsi que de ne pas embrouiller l'esprit avec l'étude du produit de quelqu'un d'autre, ainsi que de maîtriser la technique d'écriture d'applications embarquées pour les systèmes d'exploitation, ainsi que de comprendre de quoi il s'agit, j'ai décidé d'écrire mon système d'exploitation. Ce n'est pas l'odeur.
L'OS proposé (OS, le langage n'ose pas appeler son OS, et surtout OSRV) coopératif avec des tâches statiques. Comme indiqué ci-dessus, je ne suis pas partisan de l'utilisation du système d'exploitation pour les microcontrôleurs, mais plus encore, je ne suis pas partisan de l'utilisation de systèmes d'exploitation préemptifs dans les microcontrôleurs. Le multitâche préemptif, comparé à coopératif, n'est pas seulement des procédures de changement de contexte complexes, mais aussi une synchronisation des threads gourmande en ressources. L'utilisation de tâches dynamiques complique également considérablement le système d'exploitation.
Le système d'exploitation a été développé pour le processeur de la famille Cortex-M0. Avec des modifications mineures aux règles d'enregistrement et de restauration du contexte, il peut être utilisé pour d'autres types de processeurs.
Code source
Fichier IntorOS.h#ifndef __INTOROS_H #define __INTOROS_H
Fichier IntorOS.c #define _INTOROS_C #include "stm32l0xx.h" #include "IntorOS.h"
Fichier IntorOSSleepIAR.s #define SHT_PROGBITS 0x1 EXTERN KolvoTask EXTERN TaskList EXTERN TaskNum PUBLIC Sleep SECTION `.text`:CODE:NOROOT(2) THUMB
Fichier IntorOSSleepGCC.s .cpu cortex-m0 .text .cfi_sections .debug_frame .section .text.Sleep,"ax",%progbits .align 1 .global Sleep .syntax unified .thumb .thumb_func .type Sleep, %function .extern KolvoTask .extern TaskList .extern TaskNum .cfi_startproc
Constantes de compilation du système d'exploitation
#define IntorOSMaxKolvoZadach (2)
Pour des raisons religieuses, je ne peux pas utiliser l'allocation dynamique de mémoire, donc la quantité de mémoire requise doit être spécifiée au stade de la compilation.
Services OS OS
void InitTask(void (*TaskPointer)(void), unsigned long Stek);
Initialisation de la tâche. La tâche est exécutée sous la forme d'une fonction, un pointeur vers une fonction est passé à la procédure d'initialisation. Lors de l'initialisation, vous devez spécifier la taille de pile allouée à la tâche. L'ordre dans lequel les tâches sont initialisées détermine leurs identifiants. La tâche qui est initialisée en premier a l'identifiant 0. Si vous spécifiez la taille totale de la pile supérieure à celle réservée, une erreur se produira. Lorsque la tâche est initialisée, le pointeur vers la pile de tâches est défini, la pile est chargée par le contexte de tâche.
void StartOS(unsigned long Num);
Le début du système d'exploitation. En tant qu'argument de la fonction, l'identifiant de la tâche avec laquelle démarrer l'exécution est transmis. Lorsque le système d'exploitation démarre, le minuteur du système est réglé sur un quantum d'une milliseconde. Le contexte est supprimé de la pile de la tâche lancée et la tâche est appelée.
void Sleep(unsigned long ms);
Planificateur Lorsque cette fonction est appelée à partir d'une tâche, le contrôle est transféré au système d'exploitation. Le système d'exploitation sélectionne une tâche prête à être exécutée dans la liste et lui transfère le contrôle. L'argument de la fonction est le temps en millisecondes après lequel il est nécessaire de retourner le contrôle à la tâche en cours. Lorsqu'une fonction est appelée avec l'argument 0xFFFFFFFF, le contrôle ne reviendra jamais.
Il est impossible d'écrire cette fonction en C, donc l'algorithme de son fonctionnement détruit complètement la logique du langage. Le code source contient des tests de programmes en langage assembleur pour les systèmes de programmation IAR et GCC. Pour les malades, le code en C est donné. Mais je voudrais noter qu'il n'est capable de compiler correctement qu'avec certaines "phases de la lune". Dans mon cas, cela ne s'est produit qu'en utilisant le niveau moyen d'optimisation, à bas et haut niveau, le code a été compilé par erreur.
Fichier Sleep.c extern Task_t TaskList[IntorOSMaxKolvoZadach];
void EndTask(void);
Achèvement de la tâche. Comme indiqué ci-dessus, les tâches sont statiques, le déchargement des tâches est impossible. Si vous devez terminer la tâche, vous pouvez utiliser cette fonction. La tâche reste sur la liste, mais le contrôle ne lui est pas transféré.
void StopTask(unsigned long Num); void StartTask(unsigned long Num);
Arrêtez ou démarrez une tâche. L'argument est l'identifiant de la tâche. Ces fonctions vous permettent d'implémenter le gestionnaire de tâches. Il convient de noter que vous ne pouvez démarrer qu'une tâche précédemment arrêtée, l'heure jusqu'à laquelle elle démarre est 0xFFFFFFFF.
Utilisation du système d'exploitation
Par exemple, un microcontrôleur traditionnel "helword" pour un système d'exploitation développé.
#include "stm32l0xx.h" #include "stm32l0xx_ll_gpio.h" #include "IntorOS.h"
En conclusion, je voudrais sincèrement espérer que ce système d'exploitation développé pour le plaisir sera intéressant et utile aux développeurs de logiciels pour systèmes embarqués.