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 único procesador central solo se ejecuta una tarea a la vez.
Ambos tipos de sistemas operativos multitarea requieren una pila separada para cada tarea. Esto implica dos cosas: primero, que el procesador permite que las pilas se coloquen en cualquier lugar de la RAM y, por lo tanto, tiene instrucciones para mover el puntero de 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 de lado las series PIC10, 12 y 16.
Puede escribir un sistema operativo casi por completo en C, pero el conmutador de tareas, donde se mueve el SP, debe estar ensamblado. 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 múltiples pilas. Por lo general, uno quisiera 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; sin embargo, no tiene que asignar el mismo tamaño de pila para cada tarea. Recuerde que necesita suficiente pila para manejar la tarea actual, y cualquier llamada a sus subrutinas anidadas, pero también apila espacio para una llamada de interrupción ya que nunca sabe cuándo ocurrirá una.
Existen métodos bastante simples para determinar la cantidad de pila que está utilizando para cada tarea; por ejemplo, puede inicializar todas las pilas a un valor particular, digamos 0x55, y ejecutar el sistema durante 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 de RAM máximo de 4K. 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 cuando 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 del temporizador. Esto facilita que el sistema operativo cambie las pilas, ya que no es necesario guardar todos los registros y la información de estado, el SP solo puede cambiarse a otra tarea (si no hay otras tareas listas para ejecutarse, una pila inactiva es control dado). Si la tarea actual no necesita hacer una llamada al sistema operativo pero se ha estado ejecutando durante un tiempo, debe ceder el control voluntariamente para mantener el sistema receptivo.
El problema con la multitarea cooperativa es que si la tarea nunca cede el control, puede acaparar el sistema. Solo él y cualquier rutina de interrupción a la que se le dé control pueden ejecutarse, por lo que el sistema operativo parecerá 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 era tan bueno.
La multitarea preventiva es más difícil de implementar. Aquí, no se requiere que las tareas cedan el control manualmente, sino que a cada tarea se le puede dar una cantidad máxima de tiempo para ejecutarse (digamos 10 ms), y luego se realiza un cambio de tarea a la siguiente tarea ejecutable si hay 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 preventiva, pueden producirse interrupciones en cualquier momento, lo que anticipará temporalmente la tarea en ejecución.
Como señala supercat en un comentario, una ventaja de la multitarea cooperativa es que es más fácil compartir recursos (por ejemplo, hardware como un ADC multicanal o software como modificar una lista vinculada). A veces, dos tareas desean acceder al mismo recurso al mismo tiempo. Con la programación preventiva, el sistema operativo podría cambiar las tareas en el medio de una tarea utilizando un recurso. Por lo tanto, los bloqueos son necesarios para evitar que otra tarea ingrese y acceda al mismo recurso. Con la multitarea cooperativa, esto no es necesario porque la tarea controla cuándo se volverá a liberar al sistema operativo.