Hay dos tipos principales de sistemas operativos multitarea, preventivos y cooperativos. Ambos permiten que se definan múltiples tareas en el sistema, la diferencia es cómo funciona el cambio de tareas. Por supuesto, con un solo procesador central solo se ejecuta una tarea a la vez.
Ambos tipos de sistemas operativos multitarea requieren una pila separada para cada tarea. Por lo tanto, esto implica dos cosas: primero, que el procesador permita colocar pilas en cualquier lugar de la RAM y, por lo tanto, tenga instrucciones para mover el puntero de la pila (SP), es decir, no hay una pila de hardware de propósito especial como la que hay en el extremo inferior. PIC's. Esto deja fuera las series PIC10, 12 y 16.
Puede escribir un sistema operativo casi por completo en C, pero el conmutador de tareas, donde se desplaza el SP tiene que estar en el ensamblaje. En varias ocasiones he escrito conmutadores de tareas para PIC24, PIC32, 8051 y 80x86. Las agallas son muy diferentes dependiendo de la arquitectura del procesador.
El segundo requisito es que haya suficiente RAM para proporcionar varias pilas. Por lo general, a uno le gustaría al menos un par de cientos de bytes para una pila; pero incluso con solo 128 bytes por tarea, ocho pilas requerirán 1K bytes de RAM, aunque no es necesario asignar el mismo tamaño de pila para cada tarea. Recuerde que necesita suficiente pila para manejar la tarea actual, y todas las llamadas a sus subrutinas anidadas, pero también espacio de pila para una llamada de interrupción, ya que nunca se sabe cuándo ocurrirá una.
Hay métodos bastante simples para determinar la cantidad de pila que estás usando para cada tarea; por ejemplo, puede inicializar todas las pilas a un valor particular, digamos 0x55, y ejecutar el sistema por un tiempo y luego detener y examinar la memoria.
No dices qué tipo de PIC quieres usar. La mayoría de los PIC24 y PIC32 tendrán mucho espacio para ejecutar un sistema operativo multitarea; El PIC18 (el único PIC de 8 bits que tiene pilas en RAM) tiene un tamaño máximo de RAM de 4K. Así que eso es bastante dudoso.
Con la multitarea cooperativa (la más simple de las dos), el cambio de tareas solo se realiza cuando la tarea "cede" su control al sistema operativo. Esto sucede cada vez que la tarea necesita llamar a una rutina del sistema operativo para realizar alguna función que esperará, como una solicitud de E / S o una llamada de temporizador. Esto hace que sea más fácil para el SO cambiar pilas, ya que no es necesario guardar todos los registros e información de estado, el SP solo se puede cambiar a otra tarea (si no hay otras tareas listas para ejecutarse, una pila inactiva es dado el control). Si la tarea actual no necesita realizar una llamada del sistema operativo, pero se ha estado ejecutando durante un tiempo, debe renunciar voluntariamente al control para mantener el sistema receptivo.
El problema con la multitarea cooperativa es que si la tarea nunca pierde el control, puede acaparar el sistema. Solo esto y cualquier rutina de interrupción que tenga el control dado puede ejecutarse, por lo que el sistema operativo parece bloquearse. Este es el aspecto "cooperativo" de estos sistemas. Si se implementa un temporizador de vigilancia que solo se restablece cuando se realiza un cambio de tarea, entonces es posible detectar estas tareas errantes.
Windows 3.1 y versiones anteriores eran sistemas operativos cooperativos, lo que explica en parte por qué su rendimiento no fue tan bueno.
La multitarea preferente es más difícil de implementar. Aquí, las tareas no son necesarias para renunciar al control manualmente, sino que a cada tarea se le puede otorgar un tiempo máximo de ejecución (por ejemplo, 10 ms), y luego se realiza un cambio de tarea a la siguiente tarea ejecutable si existe una. Esto requiere detener arbitrariamente una tarea, guardar toda la información de estado, y luego cambiar el SP a otra tarea e iniciarla. Esto hace que el conmutador de tareas sea más complicado, requiere más pila y ralentiza un poco el sistema.
Tanto para la multitarea cooperativa como para la preventiva, las interrupciones pueden ocurrir en cualquier momento, lo que anticipará temporalmente la tarea en ejecución.
Como señala supercat en un comentario, una de las ventajas de la multitarea cooperativa es que es más fácil compartir recursos (por ejemplo, hardware como un ADC multicanal o software como la modificación de una lista vinculada). A veces, dos tareas quieren acceder al mismo recurso al mismo tiempo. Con la programación preventiva, sería posible que el sistema operativo cambie de tareas en medio de una tarea utilizando un recurso. Por lo tanto, bloqueos son necesarios para evitar que otra tarea entre y acceda al mismo recurso. Con la multitarea cooperativa, esto no es necesario porque la tarea controla cuándo se liberará automáticamente al sistema operativo.