Kotak surat diperkenalkan di artikel sebelumnya. Mereka mungkin merupakan metode komunikasi antar-tugas kedua yang paling sederhana – setelah sinyal – yang didukung oleh Nucleus SE. Mereka menyediakan sarana berbiaya rendah, tetapi fleksibel, untuk menyampaikan pesan sederhana di antara tugas-tugas.
Menggunakan Kotak Surat
Di Nucleus SE, kotak surat dikonfigurasi pada waktu pembuatan. Mungkin ada maksimum 16 kotak surat yang dikonfigurasi untuk suatu aplikasi. Jika tidak ada kotak surat yang dikonfigurasi, tidak ada struktur data atau kode panggilan layanan yang terkait dengan kotak surat yang disertakan dalam aplikasi.
Kotak surat hanyalah sebuah lokasi penyimpanan, cukup besar untuk menampung satu variabel jenis ADDR , akses yang dikendalikan sehingga dapat digunakan dengan aman oleh banyak tugas. Satu tugas dapat menulis ke kotak surat. Kemudian penuh, dan tidak ada tugas yang dapat dikirim ke sana hingga tugas membaca di kotak surat atau kotak surat direset. Mencoba mengirim ke kotak surat lengkap atau membaca dari kotak surat yang kosong dapat mengakibatkan kesalahan atau penangguhan tugas, tergantung pada opsi yang dipilih dalam panggilan API dan konfigurasi Nucleus SE.
Kotak Surat dan Antrian
Dalam beberapa implementasi OS, kotak surat tidak diterapkan, dan penggunaan antrean entri tunggal direkomendasikan sebagai alternatif. Ini terdengar masuk akal, karena antrian seperti itu akan menyediakan fungsionalitas yang sama seperti kotak surat. Namun, antrian adalah struktur data yang agak lebih kompleks daripada kotak surat dan membawa lebih banyak overhead dalam data (penunjuk kepala dan ekor dll.), kode dan waktu eksekusi.
Dengan Nucleus SE, seperti Nucleus RTOS, Anda memiliki pilihan kedua jenis objek dan dapat membuat keputusan sendiri.
Sebaiknya pertimbangkan pendekatan alternatif jika aplikasi Anda menyertakan banyak antrean, tetapi mungkin satu kotak surat. Mengganti kotak surat itu dengan antrian akan menimbulkan sedikit biaya data, tetapi menghilangkan semua kode API yang terkait dengan kotak surat. Akan sangat mudah untuk mengonfigurasi aplikasi secara dua arah dan membandingkan jejak memori dan kinerja.
Antrian akan dibahas di artikel selanjutnya.
Mengonfigurasi Kotak Surat
Jumlah Kotak Surat
Seperti kebanyakan aspek Nucleus SE, konfigurasi kotak surat terutama dikendalikan oleh #define pernyataan di nuse_config.h . Setelan kuncinya adalah NUSE_MAILBOX_NUMBER , yang menentukan berapa banyak kotak surat yang dikonfigurasi untuk aplikasi. Pengaturan default adalah 0 (yaitu tidak ada kotak surat yang digunakan) dan Anda dapat mengaturnya ke nilai apa pun hingga 16. Nilai yang salah akan menghasilkan kesalahan waktu kompilasi, yang dihasilkan oleh pengujian di nuse_config_check.h (ini termasuk dalam nuse_config.c dan karenanya dikompilasi dengan modul ini) menghasilkan #error pernyataan sedang dikompilasi.
Memilih nilai bukan nol adalah "master enable" untuk kotak surat. Ini menghasilkan beberapa struktur data yang didefinisikan dan berukuran sesuai, yang lebih banyak di artikel berikutnya. 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 kotak surat, ini adalah:
Secara default, semua ini disetel ke FALSE , sehingga menonaktifkan setiap panggilan layanan dan menghambat penyertaan kode implementasi apa pun. Untuk mengonfigurasi kotak surat 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.
/* Jumlah kotak surat di sistem - 0-16 */#define NUSE_MAILBOX_NUMBER 0 /* Pengaktif panggilan layanan:*/#define NUSE_MAILBOX_SEND FALSE #define NUSE_MAILBOX_RECEIVE FALSE #define NUSE_MAILBOX_RESET FALSE #define NUSE_MAILBOX_INFORMATION SALAH #define NUSE_MAILBOX_COUNT SALAH
Kesalahan waktu kompilasi akan terjadi jika fungsi API kotak surat diaktifkan dan tidak ada kotak surat yang dikonfigurasi (kecuali untuk NUSE_Mailbox_Count() yang selalu diizinkan). Jika kode Anda menggunakan panggilan API, yang belum diaktifkan, kesalahan waktu tautan akan terjadi, karena tidak ada kode implementasi yang disertakan dalam aplikasi.
Panggilan Layanan Kotak Surat
Nucleus RTOS mendukung sembilan panggilan layanan yang berhubungan dengan kotak surat, yang menyediakan fungsionalitas berikut:
Kirim pesan ke kotak surat. Diimplementasikan oleh NUSE_Mailbox_Send() di Nucleus SE.
Terima pesan dari kotak surat. Diimplementasikan oleh NUSE_Mailbox_Receive() di Nucleus SE.
Pulihkan kotak surat ke status tidak digunakan, tanpa tugas yang ditangguhkan (reset). Diimplementasikan oleh NUSE_Mailbox_Reset() di Nucleus SE.
Berikan informasi tentang kotak surat tertentu. Diimplementasikan oleh NUSE_Mailbox_Information() di Nucleus SE.
Mengembalikan hitungan berapa banyak kotak surat yang (saat ini) dikonfigurasi untuk aplikasi. Diimplementasikan oleh NUSE_Mailbox_Count() di Nucleus SE.
Tambahkan kotak surat baru ke aplikasi (buat). Tidak diimplementasikan di Nucleus SE.
Hapus kotak surat dari aplikasi (hapus). Tidak diimplementasikan di Nucleus SE.
Kembalikan pointer ke semua kotak surat (saat ini) dalam aplikasi. Tidak diimplementasikan di Nucleus SE.
Kirim pesan ke semua tugas yang ditangguhkan di kotak surat (broadcast). Tidak diimplementasikan di Nucleus SE.
Implementasi dari setiap panggilan layanan ini diperiksa secara mendetail.
Layanan Tulis dan Baca Kotak Surat
Operasi dasar, yang dapat dilakukan pada kotak surat, adalah menulis data ke dalamnya – yang terkadang disebut mengirim atau mengepos – dan membaca data darinya – yang juga disebut menerima . Nucleus RTOS dan Nucleus SE masing-masing menyediakan dua panggilan API dasar untuk operasi ini, yang akan dibahas di sini.
Menulis ke Kotak Surat
Panggilan API Nucleus RTOS untuk menulis ke kotak surat sangat fleksibel, memungkinkan Anda untuk menangguhkan tanpa batas waktu, atau dengan batas waktu, jika operasi tidak dapat diselesaikan segera; yaitu Anda mencoba menulis ke kotak surat penuh. Nucleus SE menyediakan layanan yang sama, kecuali penangguhan tugas bersifat opsional dan batas waktu tidak diterapkan.
Nucleus RTOS juga menawarkan fasilitas untuk menyiarkan ke kotak surat, tetapi ini tidak didukung oleh Nucleus SE. Ini akan dijelaskan di bawah API yang Tidak Diimplementasikan di artikel selanjutnya.
Panggilan Nucleus RTOS API untuk Mengirim ke Kotak Surat
Prototipe panggilan layanan:
STATUS NU_Send_To_Mailbox(NU_MAILBOX *mailbox, VOID *message, TIDAK TANDA TANGAN ditangguhkan);
Parameter:
kotak surat – penunjuk ke kotak surat yang akan digunakan
pesan – penunjuk ke pesan yang akan dikirim yaitu empat tidak ditandatangani elemen
tangguhkan – spesifikasi untuk penangguhan tugas; mungkin NU_NO_SUSPEND atau NU_SUSPEND atau nilai batas waktu
Pengembalian:
NU_SUCCESS – panggilan berhasil diselesaikan
NU_INVALID_MAILBOX – penunjuk kotak surat tidak valid
NU_INVALID_POINTER – penunjuk pesan adalah NULL
NU_INVALID_SUSPEND – penangguhan dicoba dari utas non-tugas
NU_MAILBOX_FULL – kotak surat penuh dan penangguhan tidak ditentukan
NU_TIMEOUT – kotak surat masih penuh bahkan setelah ditangguhkan selama jangka waktu tertentu
NU_MAILBOX_DELETED – kotak surat telah dihapus saat tugas ditangguhkan
NU_MAILBOX_WAS_RESET – kotak surat disetel ulang saat tugas ditangguhkan
Panggilan Nucleus SE API untuk Mengirim ke Kotak Surat
Panggilan API ini mendukung fungsionalitas utama dari Nucleus RTOS API.
Prototipe panggilan layanan:
STATUS NUSE_Mailbox_Send(NUSE_MAILBOX kotak surat, ADDR *pesan, U8 ditangguhkan);
Parameter:
kotak surat – indeks (ID) kotak surat yang akan digunakan
pesan – penunjuk ke pesan yang akan dikirim, yang merupakan variabel tunggal bertipe ADDR
tangguhkan – spesifikasi untuk penangguhan tugas; mungkin NUSE_NO_SUSPEND atau NUSE_SUSPEND
Pengembalian:
NUSE_SUCCESS – panggilan berhasil diselesaikan
NUSE_INVALID_MAILBOX – indeks kotak surat tidak valid
NUSE_INVALID_POINTER – penunjuk pesan adalah NULL
NUSE_INVALID_SUSPEND – penangguhan dicoba dari utas non-tugas atau saat memblokir panggilan API tidak diaktifkan
NUSE_MAILBOX_FULL – kotak surat penuh dan penangguhan tidak ditentukan
NUSE_MAILBOX_WAS_RESET – kotak surat disetel ulang saat tugas ditangguhkan
Implementasi Nucleus SE Pengiriman Kotak Surat
Sebagian besar kode NUSE_Mailbox_Send() Fungsi API – setelah pemeriksaan parameter – dipilih oleh kompilasi bersyarat, bergantung pada apakah dukungan untuk memblokir (penangguhan tugas) panggilan API diaktifkan. Kita akan melihat dua varian secara terpisah di sini.
Jika pemblokiran tidak diaktifkan, logika untuk panggilan API ini cukup sederhana dan kodenya memerlukan sedikit penjelasan:
if (NUSE_Mailbox_Status[kotak surat]) /* kotak surat penuh */{ return_value =NUSE_MAILBOX_FULL;}else /* kotak surat kosong */{ NUSE_Mailbox_Data[kotak surat] =*pesan; NUSE_Mailbox_Status[kotak surat] =BENAR; return_value =NUSE_SUCCESS;}
Pesan disimpan dalam elemen yang sesuai dari NUSE_Mailbox_Data[] dan kotak surat yang ditandai sedang digunakan.
Saat pemblokiran diaktifkan, kode menjadi lebih kompleks:
lakukan{ if (!NUSE_Mailbox_Status[kotak surat]) /* kotak surat kosong */ { NUSE_Mailbox_Data[kotak surat] =*pesan; NUSE_Mailbox_Status[kotak surat] =BENAR; if (NUSE_Mailbox_Blocking_Count[kotak surat] !=0) { indeks U8; /* memeriksa apakah tugas diblokir */ /* pada kotak surat ini */ NUSE_Mailbox_Blocking_Count[kotak surat]--; for (indeks=0; indeks
Beberapa penjelasan mungkin berguna:
Kode diapit dengan do…sementara loop, yang berlanjut saat parameter suspend memiliki nilai NUSE_SUSPEND .
Jika kotak surat kosong, pesan yang tersedia akan disimpan, dan status kotak surat diubah untuk menunjukkan bahwa kotak surat sudah penuh. Pemeriksaan dilakukan pada apakah ada tugas yang ditangguhkan (menunggu untuk diterima) di kotak surat. Jika ada tugas yang menunggu, yang pertama dibangunkan. penangguhan variabel disetel ke NUSE_NO_SUSPEND dan panggilan API keluar dengan NUSE_SUCCESS .
Jika kotak surat penuh dan tangguhkan disetel ke NUSE_NO_SUSPEND , panggilan API keluar dengan NUSE_MAILBOX_FULL . Jika tangguhkan disetel ke NUSE_SUSPEND , tugas ditangguhkan. Saat kembali (yaitu saat tugas dibangunkan), jika nilai yang dikembalikan adalah NUSE_SUCCESS , menunjukkan bahwa tugas dibangunkan karena pesan telah dibaca (sebagai lawan dari reset kotak surat) kode loop kembali ke atas.