Existem dois tipos principais de sistemas operacionais multitarefa, preventivo e cooperativo. Ambos permitem que várias tarefas sejam definidas no sistema, a diferença é como a alternância de tarefas funciona. Obviamente, com um único processador principal, apenas uma tarefa está sendo executada por vez.
Ambos os tipos de sistemas operacionais multitarefa requerem uma pilha separada para cada tarefa. Portanto, isso implica duas coisas: primeiro, que o processador permita que as pilhas sejam colocadas em qualquer lugar da RAM e, portanto, tenha instruções para mover o ponteiro da pilha (SP) - ou seja, não há uma pilha de hardware para fins especiais, como existe na gama baixa PIC's. Isso deixa de fora as séries PIC10, 12 e 16.
Você pode escrever um sistema operacional quase inteiramente em C, mas o alternador de tarefas, onde o SP se move, precisa estar em montagem. Em vários momentos, escrevi alternadores de tarefas para o PIC24, PIC32, 8051 e 80x86. As tripas são bem diferentes, dependendo da arquitetura do processador.
O segundo requisito é que haja RAM suficiente para fornecer várias pilhas. Normalmente, você gostaria de pelo menos algumas centenas de bytes para uma pilha; mas mesmo com apenas 128 bytes por tarefa, oito pilhas exigirão 1K bytes de RAM - você não precisa alocar a mesma pilha de tamanho para cada tarefa. Lembre-se de que você precisa de pilha suficiente para lidar com a tarefa atual e todas as chamadas para suas sub-rotinas aninhadas, mas também empilhar espaço para uma chamada de interrupção, pois você nunca sabe quando uma ocorrerá.
Existem métodos bastante simples para determinar quanta pilha você está usando para cada tarefa; por exemplo, você pode inicializar todas as pilhas para um valor específico, por exemplo, 0x55, executar o sistema por um tempo e parar e examinar a memória.
Você não diz que tipo de PIC deseja usar. A maioria dos PIC24 e PIC32 terá muito espaço para executar um sistema operacional multitarefa; o PIC18 (o único PIC de 8 bits a ter pilhas na RAM) tem um tamanho máximo de RAM de 4K. Então, isso é bastante duvidoso.
Com a multitarefa cooperativa (a mais simples das duas), a troca de tarefas só é feita quando a tarefa "desiste" de seu controle de volta ao sistema operacional. Isso acontece sempre que a tarefa precisa chamar uma rotina do SO para executar algumas funções pelas quais aguardará, como uma solicitação de E / S ou uma chamada de timer. Isso torna mais fácil para o sistema operacional alternar pilhas, pois não é necessário salvar todos os registros e informações de estado, o SP pode ser alternado para outra tarefa (se não houver outras tarefas prontas para execução, uma pilha inativa será dado controle). Se a tarefa atual não precisar fazer uma chamada do sistema operacional, mas já estiver em execução há algum tempo, precisará abrir mão do controle voluntariamente para manter o sistema responsivo.
O problema da multitarefa cooperativa é que, se a tarefa nunca abrir mão do controle, ela pode monopolizar o sistema. Somente ele e todas as rotinas de interrupção que recebem controle podem ser executados; portanto, o sistema operacional parece travar. Este é o aspecto "cooperativo" desses sistemas. Se um cronômetro de vigilância for implementado e redefinido apenas quando uma alternância de tarefas for executada, é possível capturar essas tarefas erradas.
O Windows 3.1 e versões anteriores eram sistemas operacionais cooperativos, razão pela qual em parte o desempenho deles não foi tão bom.
A multitarefa preemptiva é mais difícil de implementar. Aqui, as tarefas não são necessárias para abrir mão do controle manualmente, mas, em vez disso, cada tarefa pode ter um tempo máximo para execução (por exemplo, 10 ms) e, em seguida, uma alternância de tarefas é executada para a próxima tarefa executável, se houver uma. Isso requer interromper arbitrariamente uma tarefa, salvar todas as informações de estado e, em seguida, alternar o SP para outra tarefa e iniciá-la. Isso torna o alternador de tarefas mais complicado, requer mais pilha e torna o sistema um pouco mais lento.
Para multitarefa cooperativa e preventiva, podem ocorrer interrupções a qualquer momento, o que antecipará temporariamente a tarefa em execução.
Como a supercat aponta em um comentário, uma vantagem da multitarefa cooperativa é que é mais fácil compartilhar recursos (por exemplo, hardware como um ADC multicanal ou software como modificar uma lista vinculada). Às vezes, duas tarefas desejam acessar o mesmo recurso ao mesmo tempo. Com o planejamento preventivo, seria possível que o sistema operacional alternasse tarefas no meio de uma tarefa usando um recurso. Portanto, os bloqueios são necessários para impedir que outra tarefa entre e acesse o mesmo recurso. Com a multitarefa cooperativa, isso não é necessário porque a tarefa controla quando será lançada de volta ao sistema operacional.