Grup bendera acara diperkenalkan di artikel sebelumnya. Di Nucleus SE, mereka agak mirip dengan sinyal, tetapi dengan fleksibilitas yang lebih besar. Mereka menyediakan sarana berbiaya rendah, tetapi fleksibel, untuk menyampaikan pesan sederhana di antara tugas-tugas.
Menggunakan Bendera Acara
Di Nucleus SE, flag event dikonfigurasi pada waktu build. Mungkin ada maksimum 16 grup bendera peristiwa yang dikonfigurasi untuk suatu aplikasi. Jika tidak ada grup bendera peristiwa yang dikonfigurasi, tidak ada struktur data atau kode panggilan layanan yang terkait dengan grup bendera peristiwa yang disertakan dalam aplikasi.
Grup bendera peristiwa hanyalah satu set delapan bendera 1-bit, akses yang dikontrol sehingga dapat digunakan dengan aman oleh banyak tugas. Satu tugas dapat mengatur atau menghapus kombinasi tanda peristiwa apa pun. Tugas lain dapat membaca grup bendera acara kapan saja atau mungkin menunggu (melakukan polling atau ditangguhkan) untuk pola bendera tertentu.
Mengonfigurasi Grup Bendera Acara
Jumlah Grup Bendera Acara
Seperti sebagian besar aspek Nucleus SE, konfigurasi grup bendera peristiwa terutama dikendalikan oleh #define pernyataan di nuse_config.h . Setelan kuncinya adalah NUSE_EVENT_GROUP_NUMBER , yang menentukan berapa banyak grup bendera peristiwa yang dikonfigurasi untuk aplikasi. Pengaturan default adalah 0 (yaitu tidak ada grup bendera peristiwa 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 "pengaktifan utama" untuk grup bendera peristiwa. Ini menghasilkan beberapa struktur data yang ditentukan dan ukurannya sesuai, yang lebih banyak lagi nanti dalam seri 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 grup bendera acara, ini adalah:
Secara default, semua ini disetel ke FALSE , sehingga menonaktifkan setiap panggilan layanan dan menghambat penyertaan kode implementasi apa pun. Untuk mengonfigurasi grup tanda peristiwa 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_EVENT_GROUP_NUMBER 0 /* Jumlah grup acara dalam sistem - 0-16 */#define NUSE_EVENT_GROUP_SET FALSE /* Pengaktif panggilan layanan */#define NUSE_EVENT_GROUP_RETRIEVE FALSE /* Pengaktif panggilan layanan */#define NUSE_EVENT_GROUP_INFORMATION FALSE /* Pengaktif panggilan layanan */#define NUSE_EVENT_GROUP_COUNT FALSE /* Pengaktif panggilan layanan */
Kesalahan waktu kompilasi akan terjadi jika fungsi API grup bendera peristiwa diaktifkan dan tidak ada grup bendera peristiwa yang dikonfigurasi (kecuali untuk NUSE_Event_Group_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 Bendera Acara
Nucleus RTOS mendukung tujuh panggilan layanan yang terkait dengan flag peristiwa, yang menyediakan fungsionalitas berikut:
Setel tanda peristiwa. Diimplementasikan oleh NUSE_Event_Group_Set() di Nucleus SE.
Ambil tanda peristiwa. Diimplementasikan oleh NUSE_Event_Group_Retrieve() di Nucleus SE.
Berikan informasi tentang grup bendera peristiwa tertentu. Diimplementasikan oleh NUSE_Event_Group_Information() di Nucleus SE.
Mengembalikan hitungan berapa banyak grup bendera peristiwa yang (saat ini) dikonfigurasi untuk aplikasi. Diimplementasikan oleh NUSE_Event_Group_Count() di Nucleus SE.
Tambahkan grup bendera peristiwa baru ke aplikasi (buat). Tidak diimplementasikan di Nucleus SE.
Hapus grup bendera peristiwa dari aplikasi (hapus). Tidak diimplementasikan di Nucleus SE.
Kembalikan pointer ke semua grup flag event (saat ini) dalam aplikasi. Tidak diimplementasikan di Nucleus SE.
Implementasi dari setiap panggilan layanan ini diperiksa secara mendetail.
Perlu dicatat bahwa tidak ada fungsi reset yang disediakan (baik di Nucleus RTOS atau Nucleus SE). Ini disengaja. Reset menyiratkan kondisi khusus yang berlaku. Untuk grup bendera peristiwa, satu-satunya kondisi "khusus" adalah semua nol, yang dapat diatur dengan NUSE_Event_Group_Set() .
Pengaturan Grup Bendera Acara dan Layanan Pengambilan
Operasi fundamental, yang dapat dilakukan pada grup flag event, adalah mengatur satu atau lebih flag dan mengambil status flag saat ini. Nucleus RTOS dan Nucleus SE masing-masing menyediakan dua panggilan API dasar untuk operasi ini, yang akan dibahas di sini.
Karena flag event adalah bit, mereka paling baik divisualisasikan sebagai bilangan biner. Karena standar C tidak 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.
Menyetel Bendera Acara
Panggilan Nucleus RTOS API untuk menyetel tanda peristiwa sangat fleksibel, memungkinkan Anda menyetel dan menghapus tanda peristiwa menggunakan DAN dan ATAU operasi. Nucleus SE menyediakan layanan yang sama, kecuali penangguhan tugas bersifat opsional.
Panggilan API Nucleus RTOS untuk Pengaturan Bendera
Prototipe panggilan layanan:
STATUS NU_Set_Events(NU_EVENT_GROUP *grup, event_flags UNSIGNED, operasi OPSI);
Parameter:
grup – penunjuk ke blok kontrol grup bendera peristiwa yang disediakan pengguna
event_flags – nilai bit dari pola flag yang akan dioperasikan
operasi - operasi yang akan dilakukan; mungkin NU_OR (untuk menyetel bendera) atau NU_AND (untuk menghapus bendera)
Pengembalian:
NU_SUCCESS – panggilan berhasil diselesaikan
NU_INVALID_GROUP – penunjuk grup bendera acara tidak valid
NU_INVALID_OPERATION – operasi yang ditentukan bukan NU_OR atau NU_AND
Panggilan API Nucleus SE untuk Pengaturan Bendera
Panggilan API ini mendukung fungsionalitas utama dari Nucleus RTOS API.
Prototipe panggilan layanan:
STATUS NUSE_Event_Group_Set(grup NUSE_EVENT_GROUP, U8 event_flags, operasi OPTION);
Parameter:
grup – indeks (ID) grup acara di mana flag akan disetel/dihapus
event_flags – nilai bit dari pola flag yang akan dioperasikan
operasi - operasi yang akan dilakukan; mungkin NUSE_OR (untuk menyetel tanda) atau NUSE_AND (untuk menghapus bendera)
Pengembalian:
NUSE_SUCCESS – panggilan berhasil diselesaikan
NUSE_INVALID_GROUP – indeks grup bendera acara tidak valid
NUSE_INVALID_OPERATION – operasi yang ditentukan bukan NUSE_OR atau NUSE_AND
Implementasi Nucleus SE dari Bendera Peristiwa yang Ditetapkan
Kode awal NUSE_ Event_Group_Set() Fungsi API – setelah pemeriksaan parameter – adalah umum, baik dukungan untuk memblokir (penangguhan tugas) panggilan API diaktifkan atau tidak. Logikanya cukup sederhana:
Pola bit, event_flags , hanya ORed atau AND ke grup flag event yang ditentukan.
Kode yang tersisa hanya disertakan jika pemblokiran tugas diaktifkan:
#jika NUSE_BLOCKING_ENABLE while (NUSE_Event_Group_Blocking_Count[group] !=0) { indeks U8; /* periksa apakah ada tugas yang diblokir */ /* di grup acara ini */ untuk (indeks=0; indeks { jika ((LONIB(NUSE_Task_Status[index]) == NUSE_EVENT_SUSPEND) &&(HINIB(NUSE_Task_Status[index]) ==grup)) { NUSE_Task_Blocking_Return[indeks] =NUSE_SUCCESS; NUSE_Task_Status[index] =NUSE_READY; istirahat; } } NUSE_Event_Group_Blocking_Count[group]--; } #jika NUSE_SCHEDULER_TYPE ==NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif#endifNUSE_CS_Exit();kembalikan NUSE_SUCCESS;
Jika ada tugas yang ditangguhkan pada (mengambil dari) grup bendera acara ini, semuanya akan dilanjutkan. Ketika mereka memiliki kesempatan untuk mengeksekusi, yang bergantung pada penjadwal, mereka dapat menentukan apakah persyaratan pengembalian mereka telah dipenuhi – lihat Mengambil Bendera Peristiwa di bawah.