
Kami memeriksa multitasking, properti sistem operasi untuk menjalankan beberapa program semi-independen secara bersamaan. Sebelum kita melihat lebih dekat pada tugas-tugasnya, kita perlu berurusan dengan persyaratan.
Artikel sebelumnya dalam seri:
Artikel # 2. RTOS: Struktur dan mode waktu-nyata
Artikel # 1. RTOS: pengantar.
Kami menggunakan kata "tugas", meskipun tidak memiliki arti yang tepat. Istilah lain, "aliran" dan "proses", lebih khusus, dan Anda harus memahami apa artinya dan bagaimana mereka berbeda.
Banyak RTOS yang digunakan dalam aplikasi tertanam menggunakan model multi-threaded. Beberapa utas dapat dieksekusi secara bersamaan, menempati ruang alamat yang sama:

Ini berarti bahwa pengalihan konteks, pertama-tama, beralih dari satu set register prosesor ke yang lain. Sederhana dan cepat. Bahaya potensial adalah bahwa setiap utas memiliki kemampuan untuk mengakses memori yang dimiliki oleh utas lain atau RTOS itu sendiri.
Alternatif adalah model multi-proses. Jika beberapa proses sedang berjalan, maka setiap proses memiliki ruang alamatnya sendiri dan Anda tidak dapat mengakses memori yang terkait dengan proses atau RTOS lainnya:

Ini membuat pengalihan konteks menjadi lebih sulit dan memakan waktu, karena sistem operasi harus mengkonfigurasi unit manajemen memori dengan tepat, manajer memori (Unit Manajemen Memori Inggris, MMU). Tentu saja, arsitektur seperti itu hanya dimungkinkan dengan prosesor yang mendukung MMU. Proses ini didukung oleh RTOS "kinerja tinggi" dan sebagian besar OS desktop. Selain itu, setiap proses dapat mendukung pemisahan menjadi beberapa utas, tetapi properti ini jarang digunakan dalam aplikasi embedded biasa.
Jika MMU tersedia, kompromi dapat dicapai:

Banyak RTOS "streaming" yang mendukung MMU untuk melindungi memori dari akses yang tidak sah. Dengan demikian, sementara tugas berada dalam konteks, hanya sebagian dari kode / data dan bagian yang diperlukan dari RTOS yang "terlihat"; blok memori yang tersisa dinonaktifkan, dan upaya akses akan menyebabkan keadaan darurat (untuk orang biasa) / pengecualian (untuk programmer). Ini membuat pengalihan konteks sedikit lebih sulit, tetapi aplikasi itu sendiri lebih aman. Mode ini dapat disebut "Mode Proteksi Thread" atau "Mode Proses Ringan".
Perencana
Seperti yang kita ketahui, ilusi pelaksanaan tugas simultan dicapai dengan mengalokasikan waktu prosesor untuk menyelesaikan masing-masing tugas. Ini adalah fungsi inti dari kernel. Metode pembagian waktu antar tugas disebut "perencanaan." Penjadwal - perangkat lunak yang menentukan tugas selanjutnya untuk mentransfer kontrol. Logika penjadwal dan mekanisme yang menentukan kapan dan apa yang harus dieksekusi adalah algoritma perencanaan. Pada bagian ini, kita melihat beberapa algoritma perencanaan. Perencanaan tugas adalah topik yang luas, dan banyak buku dikhususkan untuk itu. Kami akan memberikan minimum yang diperlukan untuk memahami apa yang dapat ditawarkan oleh RTOS tertentu dalam hal ini.
Lari ke Penjadwal Penyelesaian (RTC)
Penjadwal RTC (run-to-completion) sangat sederhana dan menghabiskan sumber daya minimal. Ini adalah layanan yang ideal jika memenuhi persyaratan aplikasi. Di bawah ini adalah grafik untuk sistem yang menggunakan penjadwal RTC:

Penjadwal secara bergiliran menjalankan fungsi tingkat atas dari setiap tugas. Tugas mengontrol prosesor (memotongnya) sampai fungsi tingkat atas mengeksekusi pengembalian pernyataan kembali. Jika RTOS mendukung penangguhan tugas, maka tugas apa pun yang saat ini ditangguhkan tidak dijalankan. Topik ini dibahas dalam artikel di bawah ini, lihat "Menjeda tugas."
Keuntungan besar dari penjadwal RTC, selain kesederhanaan, adalah tumpukan tunggal dan portabilitas kode (perakitan tidak diperlukan). Kelemahannya adalah bahwa tugas tersebut dapat "mengambil" prosesor, sehingga pengembangan program yang cermat diperlukan. Terlepas dari kenyataan bahwa setiap kali tugas dilakukan dari awal (tidak seperti penjadwal lain, yang memungkinkan Anda untuk mulai bekerja dari tempat pemberhentian), Anda dapat mencapai lebih banyak fleksibilitas dengan bantuan variabel statis dari "keadaan", yang menentukan logika setiap panggilan berikutnya.
Penjadwal Round Robin (RR)
Penjadwal RR ("carousel") mirip dengan RTC, tetapi lebih fleksibel dan karenanya lebih kompleks:

Namun, dalam kasus penjadwal RR, tugas tidak perlu menjalankan pernyataan kembali dalam fungsi tingkat atas. Dia dapat membebaskan prosesor kapan saja dengan melakukan panggilan RTOS. Panggilan ini menyebabkan kernel untuk menyimpan konteks tugas saat ini (semua register, termasuk penunjuk tumpukan dan penunjuk perintah) dan memuat konteks tugas berikutnya dalam antrian. Dalam beberapa RTOS, prosesor dapat dibebaskan (menjeda tugas) untuk mengantisipasi ketersediaan sumber daya kernel. Ini lebih rumit, tetapi prinsipnya sama.
Fleksibilitas penjadwal RR ditentukan oleh kemampuan untuk terus melakukan tugas-tugas dari saat penskorsan, tanpa membuat perubahan pada kode aplikasi. Untuk fleksibilitas Anda harus membayar lebih sedikit portabilitas kode dan tumpukan terpisah untuk setiap tugas.
Penjadwal Time Slice (TS)
Penjadwal TS (slice waktu - "slice waktu") ke level yang lebih kompleks daripada RR. Waktu dibagi menjadi slot (interval, irisan waktu), di mana setiap tugas dapat dilakukan dalam interval yang ditugaskan:

Selain kemampuan untuk membebaskan prosesor secara sukarela, tugas tersebut dapat terganggu oleh panggilan ke penjadwal yang dieksekusi oleh pengendali interupsi timer sistem. Gagasan menetapkan jangka waktu tetap untuk setiap tugas sangat menarik (jika memungkinkan): mudah dipahami, dan sangat dapat diprediksi.
Kerugian dari penjadwal TS adalah bahwa persentase waktu CPU yang dialokasikan untuk setiap tugas dapat berbeda, tergantung pada apakah tugas lain ditangguhkan dan bagian lain dari slot gratis:

Penjadwal TS dapat menjadi lebih dapat diprediksi jika tugas di latar belakang diimplementasikan. Tugas latar belakang dapat dilakukan alih-alih tugas yang ditangguhkan dan mengambil interval waktu saat tugas dilepaskan (atau berhenti sendiri).

Jelas, tugas latar belakang seharusnya tidak melakukan pekerjaan kritis waktu, karena bagian dari waktu prosesor yang dialokasikan untuk itu benar-benar tidak dapat diprediksi: itu tidak pernah dapat dijadwalkan.
Solusi semacam itu mengasumsikan bahwa setiap tugas dapat memprediksi kapan akan direncanakan kembali. Misalnya, jika Anda memiliki slot untuk 10 ms dan 10 tugas, tugas tahu bahwa jika dibebaskan, itu akan terus dijalankan setelah 100 ms. Dengan solusi ini, Anda dapat mencapai konfigurasi siklus waktu (timing) yang lebih fleksibel untuk tugas aplikasi.
RTOS dapat menyediakan slot waktu yang berbeda untuk setiap tugas. Ini memberikan lebih banyak fleksibilitas, tetapi juga dapat diprediksi seperti halnya dengan ukuran interval tetap. Pilihan lain adalah mengalokasikan lebih dari satu interval untuk tugas yang sama, jika Anda perlu menambah proporsi waktu prosesor yang dialokasikan.
Penjadwal Prioritas
Sebagian besar RTOS mendukung perencanaan berbasis prioritas. Idenya sederhana: setiap tugas diberi prioritas, dan setiap saat tugas yang memiliki prioritas tertinggi dan "siap" untuk eksekusi ditransfer ke prosesor:

Penjadwal dimulai ketika suatu peristiwa terjadi (misalnya, interupsi atau panggilan ke layanan kernel tertentu) yang memaksa tugas dengan prioritas tinggi untuk menjadi "siap". Ada tiga keadaan di mana penjadwal mulai bekerja:
• Tugas ditangguhkan; penjadwal harus menjadwalkan tugas berikutnya.
• Suatu tugas menyiapkan tugas dengan prioritas lebih tinggi (menggunakan panggilan API).
• Penangan interupsi (Interrupt Service Routine, ISR) menyiapkan tugas dengan prioritas lebih tinggi. Ini bisa menjadi pengendali interupsi untuk perangkat I / O atau hasil dari pengatur waktu sistem.
Jumlah tingkat prioritas bervariasi (dari 8 hingga beberapa ratus), nilai ambang juga bervariasi: beberapa RTOS menganggap prioritas tertinggi sebagai 0, sementara yang lain 0 menunjukkan prioritas terendah.
Beberapa RTOS hanya mengizinkan satu tugas di setiap tingkat prioritas; yang lain memungkinkan beberapa, yang sangat menyulitkan struktur data terkait. Banyak sistem operasi memungkinkan Anda untuk mengubah prioritas tugas pada saat dijalankan, yang semakin memperumit proses.
Penjadwal Komposit
Kami memeriksa beberapa perencana, namun, banyak RTOS komersial menawarkan solusi yang lebih canggih yang memiliki karakteristik beberapa algoritma sekaligus. Misalnya, RTOS dapat mendukung banyak tugas di setiap tingkat prioritas, dan kemudian menggunakan TS untuk membagi waktu di antara beberapa tugas siap pakai di tingkat tertinggi.
Status tugas
Pada waktu tertentu, hanya satu tugas yang dilakukan. Selain waktu prosesor yang dihabiskan untuk interrupt handler (lebih lanjut tentang ini di artikel berikutnya) atau penjadwal, tugas "saat ini" adalah tugas yang kodenya sedang dijalankan dan yang datanya ditandai dengan nilai register saat ini. Mungkin ada tugas-tugas lain yang "siap" untuk diluncurkan, dan itu akan diperhitungkan oleh penjadwal. Dalam RTOS sederhana menggunakan penjadwal RTC, RR, atau TS, itu saja. Tetapi lebih sering, dan selalu dengan penjadwal Prioritas, tugas-tugas juga bisa dalam keadaan ditangguhkan, yang berarti bahwa mereka tidak diperhitungkan oleh penjadwal sampai mereka dilanjutkan dan masuk ke keadaan "kesiapan".
Jeda tugas
Menjeda tugas bisa sangat sederhana: tugas itu dijeda dengan sendirinya (dengan memanggil API) atau tugas lain menjeda. Melalui panggilan API lain, tugas yang ditangguhkan dapat dilanjutkan oleh tugas lain atau interrupt handler. Ini adalah penangguhan “tanpa syarat” atau “murni”. Beberapa sistem operasi menyebut tugas ini "tidur".
RTOS dapat memberikan tugas dengan kemampuan untuk berhenti (tertidur) untuk jangka waktu tertentu, setelah itu dilanjutkan (sesuai dengan jam sistem). Ini bisa disebut "tertidur."
Jika RTOS mendukung "pemblokiran" panggilan API, suspensi yang lebih canggih dapat digunakan. Panggilan semacam itu memungkinkan tugas untuk meminta layanan atau sumber daya yang akan segera diterimanya jika tersedia. Kalau tidak, itu akan ditangguhkan sampai tersedia. Timeout juga dapat didefinisikan di mana tugas dilanjutkan jika sumber daya tidak tersedia untuk jangka waktu tertentu.
Status tugas lainnya
Banyak RTOS mendukung negara bagian lain, tetapi konsep dan definisi sangat bervariasi. Misalnya, negara adalah "selesai", yang berarti bahwa fungsi eksternal tugas telah keluar (baik dengan mengembalikan kode atau hanya dengan menyelesaikan blok fungsi eksternal). Agar tugas yang diselesaikan untuk mulai berjalan kembali, mungkin perlu diatur ulang entah bagaimana.
Pilihan lain adalah status terminated. Ini mirip dengan suspensi lengkap (murni), kecuali bahwa tugas harus diatur ulang untuk memulai kembali.
Jika RTOS mendukung pembuatan dinamis dan penghapusan tugas (lihat artikel berikut), ini menyiratkan kemungkinan status tugas lainnya - “dihapus”.
Ketika kami mengerjakan sistem operasi OSRV MAX real-time kami sendiri (artikel yang sebelumnya diterbitkan tentang hal itu), tim kami “menemukan” blog Colin Walls, seorang ahli mikroelektronika dan firmware di Mentor Graphics. Artikel-artikel tampak menarik, menerjemahkannya untuk diri mereka sendiri, tetapi agar tidak "menulis ke meja" mereka memutuskan untuk menerbitkan. Saya harap mereka juga bermanfaat bagi Anda. Jika demikian, maka kami berencana untuk menerbitkan semua artikel yang diterjemahkan dalam seri.
Tentang Pengarang: Colin Walls telah bekerja di industri elektronik selama lebih dari tiga puluh tahun, mencurahkan sebagian besar waktunya untuk firmware. Dia sekarang adalah seorang insinyur firmware di Mentor Embedded (sebuah divisi dari Mentor Graphics). Colin Walls sering berbicara di konferensi dan seminar, penulis berbagai artikel teknis dan dua buku tentang firmware. Tinggal di Inggris. Blog profesional Colin: blogs.mentor.com/colinwalls , email: colin_walls@mentor.comArtikel pertama dan kedua dari siklus diposting di
sini.