Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial Internet of Things >> Tertanam

Kotak Surat:pengenalan dan layanan dasar


Lihat seri Terungkap RTOS

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:

NUSE_MAILBOX_SEND
NUSE_MAILBOX_RECEIVE
NUSE_MAILBOX_RESET
NUSE_MAILBOX_INFORMATION
NUSE_MAILBOX_COUNT

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.


Tertanam

  1. Pengantar Kunci Cam dan Cara Kerjanya
  2. Pengantar Sekrup Mata dan Cara Kerjanya
  3. Pengantar Grommet dan Cara Kerjanya
  4. Pengantar Baja Tahan Karat dan Cara Pembuatannya
  5. COVID 19 dan Cloud; COVID 19 dan Dampaknya pada Bisnis
  6. C# Input dan Output Dasar
  7. Semaphores:layanan utilitas dan struktur data
  8. Semaphores:pengenalan dan layanan dasar
  9. Grup tanda peristiwa:layanan utilitas dan struktur data
  10. Grup bendera acara:pengenalan dan layanan dasar