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

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:

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.


Tertanam

  1. Sinyal
  2. Rutronik:MCU Nirkabel berdaya sangat rendah dari Redpine Signals
  3. Rutronik:SoC dan modul nirkabel multiprotokol dari Redpine Signals
  4. Mendeteksi Magnetisme Inti Atom Tunggal
  5. Jaringan Syaraf Tiruan Dapat Meningkatkan Komunikasi Nirkabel
  6. Perangkat Fleksibel Baru Dapat Mengubah Sinyal WiFi Menjadi Listrik
  7. Sirkuit Baru Mendeteksi Sinyal Radio Terlemah yang Diizinkan Oleh Mekanika Kuantum
  8. Laser Sekarang Dapat Memancarkan Gelombang Mikro Dan Menerima Sinyal Frekuensi Radio Eksternal
  9. Algoritma Baru Memadukan Dua Sinyal Audio dengan Mulus
  10. Pedoman untuk Desain RF dan Microwave