Esistono due tipi principali di sistemi operativi multitasking, preventivo e cooperativo. Entrambi consentono di definire più attività nel sistema, la differenza è come funziona il cambio di attività. Ovviamente con un singolo core-processor è effettivamente in esecuzione solo un'attività alla volta.
Entrambi i tipi di sistemi operativi multitasking richiedono uno stack separato per ogni attività. Quindi questo implica due cose: in primo luogo, che il processore consente di posizionare gli stack in qualsiasi punto della RAM e quindi ha le istruzioni per spostare il puntatore dello stack (SP) in giro, ovvero non esiste uno stack hardware per scopi speciali come quello presente nella fascia bassa PIC. Questo esclude le serie PIC10, 12 e 16.
È possibile scrivere un sistema operativo quasi interamente in C, ma il commutatore di attività, in cui si sposta SP, deve essere in assembly. In varie occasioni ho scritto commutatori di attività per PIC24, PIC32, 8051 e 80x86. Le viscere sono tutte abbastanza diverse a seconda dell'architettura del processore.
Il secondo requisito è che ci sia abbastanza RAM per fornire più stack. Di solito si vorrebbe almeno un paio di centinaia di byte per uno stack; ma anche a soli 128 byte per attività, otto stack richiedono 1K byte di RAM, tuttavia non è necessario allocare lo stesso stack di dimensioni per ogni attività. Ricorda che hai bisogno di uno stack sufficiente per gestire l'attività corrente e tutte le chiamate alle sue subroutine nidificate, ma impila anche lo spazio per una chiamata di interruzione poiché non sai mai quando si verificherà.
Esistono metodi abbastanza semplici per determinare la quantità di stack utilizzata per ciascuna attività; ad esempio è possibile inizializzare tutti gli stack su un valore particolare, ad esempio 0x55, ed eseguire il sistema per un po ', quindi arrestare ed esaminare la memoria.
Non dici che tipo di PIC vuoi usare. La maggior parte dei PIC24 e PIC32 avranno un sacco di spazio per eseguire un sistema operativo multitasking; il PIC18 (l'unico PIC a 8 bit con stack nella RAM) ha una dimensione RAM massima di 4K. Quindi è piuttosto incerto.
Con il multitasking cooperativo (il più semplice dei due), il cambio di attività viene eseguito solo quando l'attività "cede" il suo controllo al sistema operativo. Ciò accade ogni volta che l'attività deve chiamare una routine del sistema operativo per eseguire alcune funzioni che attenderanno, come una richiesta I / O o una chiamata timer. Questo rende più facile per il sistema operativo cambiare stack, poiché non è necessario salvare tutti i registri e le informazioni sullo stato, l'SP può essere semplicemente commutato su un'altra attività (se non ci sono altre attività pronte per essere eseguite, uno stack inattivo è dato controllo). Se l'attività corrente non deve effettuare una chiamata al sistema operativo ma è in esecuzione da un po ', deve rinunciare volontariamente al controllo per mantenere la risposta del sistema.
Il problema con il multitasking cooperativo è che se l'attività non abbandona mai il controllo, può ostacolare il sistema. Solo esso e tutte le routine di interruzione a cui viene dato il controllo possono essere eseguiti, quindi il sistema operativo sembrerà bloccarsi. Questo è l'aspetto "cooperativo" di questi sistemi. Se viene implementato un timer watchdog che viene ripristinato solo quando viene eseguita una commutazione di attività, è possibile rilevare queste attività errate.
Windows 3.1 e precedenti erano sistemi operativi cooperativi, motivo per cui le loro prestazioni non erano così grandi.
Il multitasking preventivo è più difficile da implementare. Qui, alle attività non è richiesto di rinunciare al controllo manualmente, ma invece a ciascuna attività può essere concesso un periodo di tempo massimo per l'esecuzione (diciamo 10 ms), quindi un passaggio di attività viene eseguito all'attività eseguibile successiva, se presente. Ciò richiede l'interruzione arbitraria di un'attività, il salvataggio di tutte le informazioni sullo stato, quindi il passaggio dell'SP a un'altra attività e l'avvio. Ciò rende il commutatore di attività più complicato, richiede più stack e rallenta un po 'il sistema.
Sia per il multitasking cooperativo che preventivo, possono verificarsi interruzioni in qualsiasi momento che impediranno temporaneamente l'attività in esecuzione.
Come sottolinea un supercat in un commento, un vantaggio offerto dal multitasking cooperativo è che è più facile condividere le risorse (ad es. Hardware come un ADC multicanale o software come la modifica di un elenco collegato). A volte due attività vogliono accedere alla stessa risorsa contemporaneamente. Con la pianificazione preventiva, sarebbe possibile per il sistema operativo cambiare attività nel mezzo di un'attività usando una risorsa. Pertanto sono necessari blocchi per impedire che un'altra attività entri e acceda alla stessa risorsa. Con il multitasking cooperativo, ciò non è necessario perché l'attività controlla quando lo rilascerà automaticamente sul sistema operativo.