Ada dua jenis utama sistem operasi multitasking, preemptive dan kooperatif. Keduanya memungkinkan beberapa tugas untuk didefinisikan dalam sistem, perbedaannya adalah bagaimana pengalihan tugas bekerja. Tentu saja dengan prosesor inti tunggal, hanya satu tugas yang benar-benar berjalan pada suatu waktu.
Kedua jenis OS multitasking ini membutuhkan tumpukan terpisah untuk setiap tugas. Jadi ini menyiratkan dua hal: pertama, bahwa prosesor memungkinkan tumpukan untuk ditempatkan di mana saja di RAM dan karena itu memiliki instruksi untuk memindahkan penunjuk tumpukan (SP) di sekitar - yaitu tidak ada tumpukan perangkat keras tujuan khusus seperti yang ada pada low-end PIC. Ini membuat PIC10, 12 dan 16 seri.
Anda dapat menulis OS hampir seluruhnya dalam bahasa C, tetapi pengalih tugas, tempat SP bergerak harus berada dalam perakitan. Di berbagai waktu saya telah menulis pengalih tugas untuk PIC24, PIC32, 8051, dan 80x86. Nyali semuanya sangat berbeda tergantung pada arsitektur prosesor.
Persyaratan kedua adalah bahwa ada cukup RAM untuk menyediakan banyak tumpukan. Biasanya satu ingin setidaknya beberapa ratus byte untuk tumpukan; tetapi bahkan hanya dengan 128 byte per tugas, delapan tumpukan akan membutuhkan 1K byte RAM - Anda tidak harus mengalokasikan tumpukan ukuran yang sama untuk setiap tugas. Ingat Anda membutuhkan tumpukan yang cukup untuk menangani tugas saat ini, dan semua panggilan ke subrutin bersarangnya, tetapi juga tumpukan ruang untuk panggilan interupsi karena Anda tidak pernah tahu kapan akan terjadi.
Ada metode yang cukup sederhana untuk menentukan berapa banyak tumpukan yang Anda gunakan untuk setiap tugas; misalnya Anda dapat menginisialisasi semua tumpukan ke nilai tertentu, katakan 0x55, dan jalankan sistem untuk sementara waktu lalu berhenti dan periksa memori.
Anda tidak mengatakan PIC seperti apa yang ingin Anda gunakan. Kebanyakan PIC24 dan PIC32 akan memiliki banyak ruang untuk menjalankan OS multitasking; PIC18 (satu-satunya PIC 8-bit yang memiliki tumpukan dalam RAM) memiliki ukuran RAM maksimum 4K. Jadi itu sangat rapuh.
Dengan multitasking kooperatif (yang lebih sederhana dari keduanya), pengalihan tugas hanya dilakukan ketika tugas "menyerahkan" kontrolnya kembali ke OS. Ini terjadi setiap kali tugas perlu memanggil rutin OS untuk melakukan beberapa fungsi yang akan ditunggu, seperti permintaan I / O atau panggilan waktu. Ini membuatnya lebih mudah bagi OS untuk berganti tumpukan, karena tidak perlu untuk menyimpan semua register dan informasi negara, SP hanya dapat dialihkan ke tugas lain (jika tidak ada tugas lain yang siap dijalankan, tumpukan menganggur adalah diberikan kontrol). Jika tugas saat ini tidak perlu membuat panggilan OS tetapi telah berjalan untuk sementara waktu, itu perlu menyerahkan kontrol secara sukarela untuk menjaga sistem responsif.
Masalah dengan multitasking kooperatif adalah jika tugas tersebut tidak pernah menyerah kontrol, itu dapat merusak sistem. Hanya itu dan rutinitas interupsi apa pun yang kebetulan diberikan kontrol yang dapat berjalan, sehingga OS tampaknya akan terkunci. Ini adalah aspek "kooperatif" dari sistem ini. Jika pengawas waktu diimplementasikan yang hanya mengatur ulang ketika switch tugas dilakukan, maka dimungkinkan untuk menangkap tugas-tugas yang salah ini.
Windows 3.1 dan sebelumnya adalah sistem operasi kooperatif, yang sebagian mengapa kinerja mereka tidak begitu bagus.
Preemptive multitasking lebih sulit untuk diterapkan. Di sini, tugas tidak diharuskan untuk menyerahkan kontrol secara manual, tetapi sebaliknya setiap tugas dapat diberikan jumlah maksimum waktu untuk menjalankan (katakanlah 10 ms), dan kemudian sakelar tugas dilakukan ke tugas yang dapat dijalankan berikutnya jika ada. Ini mengharuskan penghentian tugas secara sewenang-wenang, menyimpan semua informasi status, dan kemudian mengalihkan SP ke tugas lain dan memulainya. Ini membuat pengalih tugas lebih rumit, membutuhkan lebih banyak tumpukan, dan memperlambat sistem sedikit.
Untuk multitasking kooperatif dan preemptive, interupsi dapat terjadi kapan saja yang sementara akan mencegah tugas berjalan.
Seperti yang ditunjukkan supercat dalam komentar, satu kelebihan yang dimiliki multitasking koperasi adalah lebih mudah untuk berbagi sumber daya (mis. Perangkat keras seperti ADC multi-saluran atau perangkat lunak seperti memodifikasi daftar yang ditautkan). Terkadang dua tugas menginginkan akses ke sumber daya yang sama pada saat yang sama. Dengan penjadwalan preemptive, OS dimungkinkan untuk berpindah tugas di tengah satu tugas menggunakan sumber daya. Jadi kunci diperlukan untuk mencegah tugas lain masuk dan mengakses sumber daya yang sama. Dengan multitasking kooperatif, ini tidak perlu karena tugas mengontrol kapan akan melepaskannya kembali ke OS.