
Dalam artikel sebelumnya, kami memeriksa model multitasking, dan menemukan bahwa setiap tugas adalah program semi-independen. Meskipun tugas-tugas dalam embedded system memiliki tingkat kemandirian tertentu, ini tidak berarti bahwa mereka tidak “saling mengetahui”. Beberapa tugas akan benar-benar terisolasi dari yang lain, tetapi interaksi dan sinkronisasi di antara mereka adalah persyaratan umum. Mekanisme ini adalah salah satu fungsi utama RTOS. Kisaran fungsi dapat bervariasi tergantung pada RTOS, oleh karena itu, dalam artikel ini kami akan mempertimbangkan opsi yang tersedia untuk umum.
Artikel sebelumnya dalam seri:
Artikel # 4. Tugas, pengalihan konteks, dan interupsiArtikel # 3. Tugas dan PerencanaanArtikel # 2. RTOS: Struktur dan mode waktu-nyata
Artikel # 1. RTOS: pengantar.
Rentang fungsi
Ada tiga model interaksi dan sinkronisasi antar tugas:
- Layanan terkait dengan tugas: RTOS menyediakan tugas dengan atribut yang menyediakan interaksi di antara mereka. Pertimbangkan sinyal sebagai contoh.
- Objek kernel adalah alat komunikasi atau sinkronisasi yang otonom. Contoh: bendera acara, kotak surat, antrian / saluran, semafor dan mutex.
- Perpesanan adalah skema yang disederhanakan di mana RTOS memungkinkan Anda untuk membuat objek pesan dan mentransfernya dari satu tugas ke tugas lainnya. Ini sangat mendasar untuk arsitektur kernel, dan karena itu sistem seperti itu disebut "messaging RTOS."
Mekanisme yang ideal untuk proses yang berbeda akan bervariasi. Kemampuan mereka mungkin tumpang tindih, jadi ada baiknya mempertimbangkan skalabilitas model ini. Misalnya, jika suatu aplikasi memerlukan beberapa antrian, tetapi hanya satu kotak surat, Anda dapat menerapkan kotak surat dengan antrian untuk satu item. Objek ini tidak akan sepenuhnya optimal, tetapi seluruh kode kotak surat tidak akan dimasukkan dalam aplikasi, dan oleh karena itu, skalabilitas akan mengurangi jumlah memori yang digunakan oleh RTOS.
Variabel umum atau area memori
Pendekatan yang disederhanakan untuk interaksi antara tugas adalah kehadiran dalam sistem variabel atau area memori yang tersedia untuk semua tugas. Pendekatan ini dapat diterapkan pada beberapa proses, meskipun sederhana. Akses harus dikontrol. Jika variabel hanya satu byte, maka menulis ke atau membaca dari itu kemungkinan merupakan operasi atom (mis., Terus menerus), tetapi kehati-hatian harus diambil jika prosesor memungkinkan operasi lain pada byte memori, karena mereka dapat interupsi dan dapat terjadi masalah sinkronisasi. Salah satu cara untuk menerapkan penguncian / pembukaan kunci adalah dengan menonaktifkan interupsi untuk waktu yang singkat.
Jika Anda menggunakan area memori, Anda masih perlu kunci. Anda dapat menggunakan byte pertama sebagai tanda pemblokiran, mengingat arsitektur memori menyediakan akses atom ke byte ini. Satu tugas memuat data ke area memori, menetapkan bendera, dan kemudian menunggu untuk diatur ulang. Tugas lain adalah menunggu bendera diatur, membaca data, dan mengatur ulang bendera. Menggunakan interrupt nonaktifkan sebagai kunci kurang masuk akal karena memindahkan seluruh buffer data mungkin memakan waktu.
Penggunaan memori bersama ini mirip dengan implementasi banyak komunikasi antar-prosesor dalam sistem multi-inti. Dalam beberapa kasus, penguncian perangkat keras dan / atau gangguan dibangun ke antarmuka antar-prosesor dari memori bersama.
Sinyal
Sinyal adalah salah satu mekanisme paling sederhana untuk interaksi antara tugas yang ditawarkan oleh RTOS tradisional. Mereka mengandung serangkaian flag bit (8, 16 atau 32, tergantung pada aplikasi spesifik), yang terkait dengan tugas tertentu.
Bendera sinyal (atau beberapa bendera) dapat diatur oleh tugas apa pun menggunakan operasi logis "ATAU". Bendera hanya dapat dibaca oleh tugas yang berisi sinyal. Proses membaca biasanya merusak, yaitu, bendera juga diatur ulang.
Dalam beberapa sistem, sinyal diimplementasikan dengan cara yang lebih kompleks, sehingga fungsi khusus yang ditugaskan oleh pemilik tugas sinyal dieksekusi secara otomatis ketika flag sinyal ditetapkan. Ini menghilangkan kebutuhan akan tugas untuk mengendalikan bendera itu sendiri. Ini agak mirip dengan penangan interrupt.
Grup Bendera Acara
Kelompok bendera acara mirip dengan sinyal karena mereka adalah alat berorientasi bit untuk interaksi antar tugas. Demikian pula, mereka mungkin mengandung 8, 16 atau 32 bit. Tidak seperti sinyal, mereka adalah objek inti independen dan tidak "milik" untuk tugas tertentu. Tugas apa pun dapat mengatur dan mengatur ulang flag acara menggunakan operasi logis "OR" dan "AND". Demikian pula, tugas apa pun dapat memeriksa bendera acara menggunakan operasi yang sama. Di banyak RTOS, Anda dapat membuat panggilan API pemblokiran untuk kombinasi flag acara. Yaitu, tugas dapat ditunda hingga kombinasi tertentu dari flag acara ditetapkan. Opsi "konsumsi" mungkin juga tersedia ketika memeriksa bendera acara, yang mengatur ulang semua bendera.
Semafor
Semaphores adalah objek kernel independen yang digunakan untuk akuntansi sumber daya. Ada dua jenis semaphore: biner (hanya dapat memiliki dua nilai) dan umum (jumlah nilai tidak terbatas). Beberapa prosesor mendukung instruksi (atom) yang memfasilitasi implementasi semaphore biner yang cepat. Semaphore biner dapat diimplementasikan sebagai semaphores umum dengan nilai 1.
Tugas apa pun dapat mencoba menetapkan semafor untuk mendapatkan akses ke sumber daya. Jika nilai saat ini dari semaphore lebih besar dari 0 (semaphore adalah gratis), nilai counter dikurangi dengan 1, oleh karena itu, tugas akan berhasil. Dalam banyak sistem operasi, mekanisme penguncian dapat digunakan untuk menetapkan semafor. Ini berarti bahwa tugas tersebut dapat dalam keadaan menunggu sampai semafor dirilis oleh tugas lain. Tugas apa pun dapat membebaskan semaphore, dan kemudian nilai semaphore akan meningkat.
Kotak surat
Kotak surat adalah objek kernel independen yang menyediakan sarana untuk mengirim pesan. Ukuran pesan tergantung pada implementasi, tetapi biasanya diperbaiki. Ukuran pesan tipikal adalah dari satu hingga empat elemen ukuran penunjuk. Biasanya, penunjuk ke data yang lebih kompleks dikirim melalui kotak surat. Beberapa kernel mengimplementasikan kotak surat sedemikian rupa sehingga data hanya disimpan dalam variabel biasa dan kernel mengontrol akses ke sana. Kotak surat juga bisa disebut "pertukaran", meskipun nama ini sekarang jarang terlihat.
Tugas apa pun dapat mengirim pesan ke kotak surat, yang kemudian diisi. Jika suatu tugas mencoba mengirim pesan ke kotak surat lengkap, itu akan menerima respons kesalahan. Di banyak RTOS, Anda dapat menggunakan mekanisme pemblokiran untuk mengirim ke kotak surat. Ini berarti bahwa tugas akan ditangguhkan hingga pesan di kotak surat dibaca. Tugas apa pun dapat membaca pesan dari kotak surat, setelah itu kosong. Jika tugas mencoba membaca dari kotak surat kosong, itu akan menerima respons kesalahan. Di banyak RTOS, Anda dapat menggunakan panggilan pemblokiran untuk membaca dari kotak surat. Ini berarti bahwa tugas akan ditangguhkan hingga pesan baru muncul di kotak surat.
Beberapa RTOS mendukung fungsi "siaran". Ini memungkinkan Anda mengirim pesan ke semua tugas yang sedang dijeda saat membaca kotak surat tertentu.
Beberapa RTOS tidak mendukung kotak surat sama sekali. Sebagai gantinya, Anda disarankan untuk menggunakan antrian elemen tunggal. Ini setara secara fungsional, tetapi membawa overhead tambahan untuk memori dan runtime.
Antrian
Antrian adalah objek kernel independen yang menyediakan mekanisme untuk mengirim pesan. Mereka sedikit lebih fleksibel dan kompleks daripada kotak surat. Ukuran pesan tergantung pada implementasinya, tetapi biasanya tetap dan berorientasi pada kata / penunjuk.
Tugas apa pun dapat mengirim pesan ke antrian, dan ini dapat diulang sampai antrian penuh, setelah itu setiap upaya untuk mengirim akan menghasilkan kesalahan. Panjang antrian biasanya ditentukan oleh pengguna saat membuat atau mengkonfigurasi sistem. Di banyak RTOS, Anda dapat menerapkan mekanisme pemblokiran untuk mengantri. Artinya, jika antrian penuh, tugas dapat ditangguhkan hingga pesan dalam antrian dibaca oleh tugas lain. Tugas apa pun dapat membaca pesan dari antrian. Pesan dibaca dalam urutan yang sama dengan yang dikirim (First in - First out, FIFO). Jika tugas mencoba membaca dari antrian kosong, itu akan menerima respons kesalahan. Dalam banyak RTOS, mekanisme pemblokiran dapat digunakan untuk membaca dari antrian kosong. Artinya, jika antrian kosong, tugas dapat ditangguhkan hingga pesan dikirim ke antrian oleh tugas lain.
Kemungkinan besar, akan ada mekanisme dalam RTOS untuk mengirim pesan ke depan antrian, ini disebut gangguan. Beberapa RTOS juga mendukung fungsi siaran. Ini memungkinkan Anda untuk mengirim pesan ke semua tugas yang dijeda saat membaca antrian.
Selain itu, RTOS dapat mendukung pengiriman dan pembacaan pesan dengan panjang variabel. Ini memberikan lebih banyak fleksibilitas, tetapi memerlukan overhead tambahan.
Banyak RTOS mendukung jenis objek kernel lain, "pipa". Intinya, saluran mirip dengan antrian, tetapi memproses data yang berorientasi byte.
Fungsi antrian tidak menarik, tetapi harus dipahami bahwa mereka memiliki lebih banyak overhead untuk memori dan runtime daripada kotak surat, terutama karena itu perlu untuk menyimpan dua petunjuk: awal dan akhir antrian.
Mutex
Mutex (semaphores yang saling eksklusif) adalah objek kernel independen yang berperilaku sangat mirip dengan semaphore biner biasa. Mereka sedikit lebih rumit daripada semaphores dan termasuk konsep kepemilikan sementara (sumber daya yang aksesnya dikendalikan). Jika suatu tugas menetapkan mutex, hanya tugas yang sama yang dapat melepaskannya lagi: mutex (dan, karenanya, sumber daya) untuk sementara dimiliki oleh tugas tersebut.
Mutex tidak disediakan oleh semua RTOS, tetapi biner semaphore biasa cukup mudah untuk beradaptasi. Anda harus menulis fungsi memperoleh mutex yang menetapkan semaphore dan memberikan pengidentifikasi tugas. Kemudian fungsi tambahan "pelepasan mutex" memeriksa pengidentifikasi tugas pemanggilan dan melepaskan semaphore hanya jika cocok dengan nilai yang disimpan, jika tidak maka akan mengembalikan kesalahan.
Ketika kami sedang mengerjakan sistem operasi OSRV MAX real-time kami (sebelumnya saya telah menerbitkan artikel tentang 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.comBaca artikel
pertama, kedua, ketiga, keempat yang diterbitkan sebelumnya.