Існує два основних типи багатозадачних операційних систем: попереджувальна та спільна. Обидва дозволяють визначити кілька завдань у системі, різниця полягає в тому, як працює комутація завдань. Звичайно, з одним ядерним процесором фактично виконується лише одне завдання.
Обидва типи багатозадачних ОС вимагають окремого стека для кожного завдання. Отже, це означає дві речі: по-перше, процесор дозволяє розміщувати стеки в будь-якому місці оперативної пам’яті, а отже, має вказівки переміщувати покажчик стека (SP) навколо - тобто немає апаратного стеку спеціального призначення, як це є в нижньому кінці PIC's. Це виключає серії PIC10, 12 та 16.
Можна майже повністю написати ОС на C, але перемикач завдань, де SP отримує рух, повинен бути в зборі. У різні часи я писав перемикачі завдань для PIC24, PIC32, 8051 та 80x86. Усі кишки відрізняються залежно від архітектури процесора.
Друга вимога - достатня кількість оперативної пам’яті для забезпечення декількох стеків. Зазвичай хотілося б принаймні пару сотень байт для стека; але навіть у всього 128 байт на завдання, для восьми стеків буде потрібно 1 К байт оперативної пам’яті - вам не потрібно виділяти один і той же розмір стека для кожного завдання. Пам'ятайте, що вам потрібен достатній стек для обробки поточного завдання та будь-яких викликів його вкладених підпрограм, а також стек місця для переривання виклику, оскільки ви ніколи не знаєте, коли це відбудеться.
Існують досить прості методи, щоб визначити, скільки стеку ви використовуєте для кожного завдання; наприклад, ви можете ініціалізувати всі стеки до певного значення, скажімо, 0x55, та запустити систему на деякий час, а потім зупинитись та вивчити пам'ять.
Ви не кажете, який тип PIC ви хочете використовувати. Більшість PIC24 та PIC32 мають багато місця для роботи багатозадачної ОС; PIC18 (єдиний 8-розрядний PIC, що має стеки в оперативній пам'яті) має максимальний розмір оперативної пам'яті 4K. Так що це досить іффі.
При спільній багатозадачності (простіший з двох) переключення завдань робиться лише тоді, коли завдання "відмовиться" від управління назад до ОС. Це відбувається, коли завдання потрібно викликати операційну систему ОС для виконання певної функції, якої вона буде чекати, наприклад запит вводу / виводу або виклик таймера. Це полегшує ОС для перемикання стеків, оскільки не потрібно зберігати всі регістри та інформацію про стан, SP можна просто переключити на інше завдання (якщо немає інших завдань, готових до запуску, бездіяльний стек - це дано контроль). Якщо в поточному завданні не потрібно здійснювати виклик ОС, але він працює протягом певного часу, йому потрібно відмовитися від керування, щоб добровільно реагувати на систему.
Проблема кооперативного багатозадачності полягає в тому, що якщо завдання ніколи не відмовляється від контролю, воно може зависати систему. Тільки він і будь-які процедури переривання, які, можливо, отримають контроль, можуть запускатися, тому операційна система, здається, замикається. Це "кооперативний" аспект цих систем. Якщо впроваджений таймер сторожового догму, який скидається лише тоді, коли виконується перемикач завдань, то можна помилити ці помилкові завдання.
Windows 3.1 і новіші версії були кооперативними операційними системами, тому почасти їхня ефективність була не такою великою.
Переважне багатозадачність складніше здійснити. Тут завданням не потрібно відмовлятися від керування вручну, але замість цього кожній задачі може бути надана максимальна кількість часу для виконання (скажімо, 10 мс), а потім перемикач завдань виконується на наступне завдання, що виконується, якщо воно є. Для цього потрібно довільно зупинити завдання, зберегти всю інформацію про стан, а потім переключити ІП на інше завдання та запустити його. Це ускладнює перемикач завдань, вимагає більшої кількості стеків та трохи уповільнює роботу системи.
Як для кооперативного, так і попереджувального багатозадачності, в будь-який час можуть виникати переривання, які тимчасово запобігають виконанню завдання.
Як в коментарі зазначається supercat, однією з переваг спільної багатозадачності є легше обмінюватися ресурсами (наприклад, апаратне забезпечення, наприклад, багатоканальний АЦП або програмне забезпечення, наприклад, модифікація пов'язаного списку). Іноді дві задачі хочуть отримати доступ до одного і того ж ресурсу одночасно. За допомогою попереднього планування операційна система може перемикати завдання посередині однієї задачі за допомогою ресурсу. Таким чином, блокування необхідне для запобігання надходженню та доступу до того ж ресурсу до іншого завдання. За допомогою багатозадачності спільної роботи це не обов'язково, оскільки завдання контролює, коли він поверне себе до ОС.