Sinyal
Dalam RTOS Revealed ini, saya akan melihat sinyal, yang merupakan metode komunikasi antar-tugas paling sederhana yang didukung oleh Nucleus SE. Mereka menyediakan sarana biaya yang sangat rendah untuk menyampaikan pesan sederhana di antara tugas-tugas.
Menggunakan Sinyal
Sinyal berbeda dari semua jenis objek kernel lainnya karena tidak otonom – sinyal dikaitkan dengan tugas dan tidak memiliki keberadaan independen. Jika sinyal dikonfigurasi untuk suatu aplikasi, setiap tugas memiliki delapan flag sinyal.
Tugas apa pun dapat mengatur sinyal tugas lain. Hanya tugas pemilik yang dapat membaca sinyal. Pembacaan bersifat destruktif – yaitu sinyal dihapus oleh proses pembacaan. Tidak ada tugas lain yang dapat membaca atau menghapus sinyal tugas.
Ada fasilitas di Nucleus RTOS yang memungkinkan tugas untuk menominasikan fungsi yang dijalankan ketika tugas lain menetapkan satu atau lebih flag sinyalnya. Ini agak analog dengan rutinitas layanan interupsi. Kemampuan ini tidak didukung di Nucleus SE; tugas perlu menginterogasi tanda sinyal mereka secara eksplisit.
Mengonfigurasi Sinyal
Seperti kebanyakan aspek Nucleus SE, konfigurasi sinyal terutama dikendalikan oleh #define pernyataan di nuse_config.h . Setelan kuncinya adalah NUSE_SIGNAL_SUPPORT , yang mengaktifkan fasilitas (untuk semua tugas dalam aplikasi). Tidak ada pertanyaan untuk menentukan jumlah sinyal – hanya ada satu set delapan flag untuk setiap tugas dalam aplikasi.
Menyetel parameter pengaktifan ini adalah "pengaktifan master" untuk sinyal. Hal ini menyebabkan struktur data ditentukan dan ukurannya sesuai, yang akan dibahas lebih lanjut di artikel ini. Ini juga mengaktifkan pengaturan pengaktifan API.
API Diaktifkan
Setiap fungsi API (panggilan layanan) di Nucleus SE memiliki #define enabling yang memungkinkan simbol di nuse_config.h . Untuk sinyal, ini adalah:
NUSE_SIGNALS_SENDNUSE_SIGNALS_RECEIVE
Secara default, keduanya disetel ke FALSE , sehingga menonaktifkan setiap panggilan layanan dan menghambat penyertaan kode implementasi apa pun. Untuk mengonfigurasi sinyal untuk aplikasi, Anda harus memilih panggilan API yang ingin Anda gunakan dan menyetel simbol pengaktifnya ke TRUE .
Berikut ini adalah ekstrak dari nuse_config.h default berkas:
#define NUSE_SIGNAL_SUPPORT FALSE /* Mengaktifkan dukungan untuk sinyal */#define NUSE_SIGNALS_SEND FALSE /* Pengaktif panggilan layanan */#define NUSE_SIGNALS_RECEIVE FALSE /* Pengaktif panggilan layanan */
Kesalahan waktu kompilasi akan terjadi jika fungsi API sinyal diaktifkan dan fasilitas sinyal belum diaktifkan. Jika kode Anda menggunakan panggilan API, yang belum diaktifkan, kesalahan waktu tautan akan terjadi, karena tidak ada kode implementasi yang disertakan dalam aplikasi. Tentu saja, pengaktifan kedua fungsi API agak berlebihan, karena tidak ada gunanya mengaktifkan dukungan sinyal dan tidak menyediakan API ini. Pengaktifan disertakan untuk kompatibilitas dengan fitur Nucleus SE lainnya.
Panggilan Layanan Sinyal
Nucleus RTOS mendukung empat panggilan layanan yang berhubungan dengan sinyal, yang menyediakan fungsi berikut:
Kirim sinyal ke tugas tertentu. Diimplementasikan oleh NUSE_Signals_Send() di Nucleus SE.
Terima sinyal. Diimplementasikan oleh NUSE_Signals_Receive() di Nucleus SE.
Daftarkan penangan sinyal. Tidak diimplementasikan di Nucleus SE.
Aktifkan/nonaktifkan (kontrol) sinyal. Tidak diimplementasikan di Nucleus SE.
Implementasi dari setiap panggilan layanan ini diperiksa secara mendetail.
Sinyal Kirim dan Terima Layanan
Operasi dasar, yang dapat dilakukan pada serangkaian sinyal tugas, mengirim data ke sana (yang dapat dilakukan oleh tugas apa pun) dan membaca data darinya (dan dengan demikian menghapus data, yang hanya dapat dilakukan oleh pemiliknya) . Nucleus RTOS dan Nucleus SE masing-masing menyediakan dua panggilan API dasar untuk operasi ini, yang akan dibahas di sini.
Karena flag sinyal adalah bit, mereka paling baik divisualisasikan sebagai bilangan biner. Karena standar C tidak secara historis mendukung representasi konstanta biner (hanya oktal dan heksadesimal), distribusi Nucleus SE menyertakan file header yang berguna – nuse_binary.h – yang berisi #define simbol bentuk b01010101 untuk semua 256 nilai 8-bit. Berikut ini kutipan dari nuse_binary.h berkas:
#define b00000000 ((U8) 0x00)#define b00000001 ((U8) 0x01)#define b00000010 ((U8) 0x02)#define b00000011 ((U8) 0x03)#define b000000100 ((U8) 0x04)#define b00000101 ((U8) 0x05)
Mengirim Sinyal
Tugas apa pun dapat mengirim sinyal ke tugas lain apa pun dalam aplikasi. Mengirim sinyal melibatkan pengaturan satu atau lebih flag sinyal. Ini adalah operasi OR yang tidak berpengaruh pada flag yang disetel sebelumnya.
Panggilan Nucleus RTOS API untuk Mengirim Sinyal
Prototipe panggilan layanan:
STATUS NU_Send_Signals(NU_TASK *tugas, sinyal UNSIGNED);
Parameter:
tugas – penunjuk untuk mengontrol blok tugas yang memiliki bendera sinyal yang akan disetel
sinyal – nilai flag sinyal yang akan disetel
Pengembalian:
NU_SUCCESS – panggilan berhasil diselesaikan
NU_INVALID_TASK – penunjuk tugas tidak valid
Panggilan Nucleus SE API untuk Mengirim Sinyal
Panggilan API ini mendukung fungsionalitas utama dari Nucleus RTOS API.
Prototipe panggilan layanan:
STATUS NUSE_Signals_Send(tugas NUSE_TASK, sinyal U8);
Parameter:
tugas – indeks (ID) tugas yang memiliki flag sinyal yang akan disetel
sinyal – nilai flag sinyal yang akan disetel
Pengembalian:
NUSE_SUCCESS – panggilan berhasil diselesaikan
NUSE_INVALID_TASK – indeks tugas tidak valid
Implementasi Nucleus SE dari Mengirim Sinyal
Berikut adalah kode lengkap untuk NUSE_Signals_Send() fungsi:
STATUS NUSE_Signals_Send(tugas NUSE_TASK, sinyal U8){ #jika NUSE_API_PARAMETER_CHECKING if (tugas>=NUSE_TASK_NUMBER) { kembali NUSE_INVALID_TASK; } #endif NUSE_CS_Enter(); NUSE_Task_Signal_Flags[tugas] |=sinyal; NUSE_CS_Keluar(); kembalikan NUSE_SUCCESS;}
Kodenya sangat sederhana. Setelah pemeriksaan parameter apa pun, nilai sinyal di-OR ke dalam flag sinyal tugas yang ditentukan. Pemblokiran tugas tidak relevan dengan sinyal.
Menerima Sinyal
Tugas hanya dapat membaca kumpulan flag sinyalnya sendiri. Proses membacanya bersifat destruktif; yaitu itu juga mengakibatkan bendera dihapus.
Panggilan Nucleus RTOS API untuk Menerima Sinyal
Prototipe panggilan layanan:
UNSIGNED NU_Receive_Signals(VOID);
Parameter:tidak ada
Pengembalian:nilai menandai sinyal
Panggilan Nucleus SE API untuk Menerima Sinyal
Panggilan API ini mendukung fungsionalitas utama dari Nucleus RTOS API.
Prototipe panggilan layanan:
U8 NUSE_Signals_Receive(void);
Parameter:tidak ada
Mengembalikan:nilai bendera sinyal
Implementasi Nucleus SE untuk Menerima Sinyal
Berikut adalah kode lengkap untuk NUSE_Signals_Receive() fungsi:
U8 NUSE_Signals_Receive(void){ sinyal U8; NUSE_CS_Enter(); sinyal =NUSE_Task_Signal_Flags[NUSE_Task_Active]; NUSE_Task_Signal_Flags[NUSE_Task_Active] =0; NUSE_CS_Keluar(); kembali sinyal;}
Kodenya sangat sederhana. Nilai flags disalin, nilai asli dihapus dan salinan dikembalikan oleh fungsi API. Pemblokiran tugas tidak relevan dengan sinyal.