Il existe deux principaux types de systèmes d'exploitation multitâche, préemptifs et coopératifs. Les deux permettent de définir plusieurs tâches dans le système, la différence réside dans le fonctionnement du changement de tâche. Bien sûr, avec un seul processeur principal, une seule tâche est en cours d'exécution à la fois.
Les deux types de systèmes d'exploitation multitâche nécessitent une pile distincte pour chaque tâche. Cela implique donc deux choses: premièrement, le processeur permet de placer des piles n'importe où dans la RAM et a donc des instructions pour déplacer le pointeur de pile (SP) - c'est-à-dire qu'il n'y a pas de pile matérielle à usage spécial comme il y en a sur le bas de gamme Photos. Cela laisse de côté les séries PIC10, 12 et 16.
Vous pouvez écrire un OS presque entièrement en C, mais le sélecteur de tâches, où le SP se déplace, doit être en assembleur. À divers moments, j'ai écrit des commutateurs de tâches pour les PIC24, PIC32, 8051 et 80x86. Les tripes sont toutes assez différentes selon l'architecture du processeur.
La deuxième exigence est qu'il y ait suffisamment de RAM pour prévoir plusieurs piles. Habituellement, on voudrait au moins quelques centaines d'octets pour une pile; mais même à seulement 128 octets par tâche, huit piles vont nécessiter 1 Ko d'octets de RAM - vous n'avez pas besoin d'allouer la même pile de taille pour chaque tâche. N'oubliez pas que vous avez besoin de suffisamment de pile pour gérer la tâche en cours et tous les appels à ses sous-programmes imbriqués, mais aussi empiler de l'espace pour un appel d'interruption car vous ne savez jamais quand un va se produire.
Il existe des méthodes assez simples pour déterminer la quantité de pile que vous utilisez pour chaque tâche; par exemple, vous pouvez initialiser toutes les piles à une valeur particulière, disons 0x55, et exécuter le système pendant un certain temps, puis arrêter et examiner la mémoire.
Vous ne dites pas quel type de PIC vous souhaitez utiliser. La plupart des PIC24 et PIC32 auront amplement d'espace pour exécuter un système d'exploitation multitâche; le PIC18 (le seul PIC 8 bits à avoir des piles en RAM) a une taille de RAM maximale de 4K. C'est donc assez incertain.
Avec le multitâche coopératif (le plus simple des deux), le changement de tâche n'est effectué que lorsque la tâche "abandonne" son contrôle à l'OS. Cela se produit chaque fois que la tâche doit appeler une routine de système d'exploitation pour exécuter une fonction qu'elle attend, comme une demande d'E / S ou un appel de temporisation. Cela facilite le basculement des piles par le système d'exploitation, car il n'est pas nécessaire de sauvegarder tous les registres et les informations d'état, le SP peut simplement être basculé vers une autre tâche (s'il n'y a pas d'autres tâches prêtes à s'exécuter, une pile inactive est contrôle). Si la tâche en cours n'a pas besoin d'appeler le système d'exploitation mais s'exécute depuis un certain temps, elle doit abandonner volontairement le contrôle pour que le système reste réactif.
Le problème avec le multitâche coopératif est que si la tâche n'abandonne jamais le contrôle, elle peut monopoliser le système. Seul celui-ci et toutes les routines d'interruption qui se trouvent être contrôlées peuvent s'exécuter, de sorte que le système d'exploitation semble se bloquer. C'est l'aspect "coopératif" de ces systèmes. Si un temporisateur de surveillance est implémenté et n'est réinitialisé que lorsqu'un changement de tâche est effectué, il est possible d'attraper ces tâches errantes.
Windows 3.1 et les versions antérieures étaient des systèmes d'exploitation coopératifs, ce qui explique en partie pourquoi leurs performances n'étaient pas si bonnes.
Le multitâche préemptif est plus difficile à mettre en œuvre. Ici, les tâches ne sont pas nécessaires pour abandonner le contrôle manuellement, mais à la place, chaque tâche peut se voir attribuer un délai maximal (par exemple 10 ms), puis un changement de tâche est effectué vers la tâche exécutable suivante s'il y en a une. Cela nécessite d'arrêter arbitrairement une tâche, d'enregistrer toutes les informations d'état, puis de basculer le SP vers une autre tâche et de la démarrer. Cela rend le sélecteur de tâches plus compliqué, nécessite plus de pile et ralentit un peu le système.
Pour le multitâche coopératif et préemptif, des interruptions peuvent survenir à tout moment, ce qui préemptera temporairement la tâche en cours d'exécution.
Comme le souligne Supercat dans un commentaire, un avantage du multitâche coopératif est qu'il est plus facile de partager des ressources (par exemple du matériel comme un ADC multicanal ou un logiciel comme la modification d'une liste chaînée). Parfois, deux tâches souhaitent accéder à la même ressource en même temps. Avec une planification préemptive, il serait possible pour le système d'exploitation de commuter des tâches au milieu d'une tâche à l'aide d'une ressource. Les verrous sont donc nécessaires pour empêcher qu'une autre tâche n'entre et n'accède à la même ressource. Avec le multitâche coopératif, cela n'est pas nécessaire car la tâche contrôle quand elle se libérera automatiquement sur le système d'exploitation.