Artikel ini melanjutkan pembahasan tentang semaphore.
Layanan Utilitas Semaphore
Nucleus RTOS memiliki empat panggilan API yang menyediakan fungsi utilitas yang terkait dengan semaphore:reset semaphore, mengembalikan informasi tentang semaphore, mengembalikan nomor semaphore dalam aplikasi dan mengembalikan pointer ke semua semaphore dalam aplikasi. Tiga yang pertama diimplementasikan di Nucleus SE.
Menyetel Ulang Semafor
Panggilan API ini mengembalikan semaphore ke keadaan awal yang tidak digunakan. Fungsi API ini tidak biasa, dibandingkan dengan yang tersedia untuk objek kernel lainnya, karena, meskipun ini adalah reset, ia tidak hanya menginisialisasi penghitungnya ke nilai awal; hitungan awal baru disediakan dalam panggilan. Setiap tugas yang ditangguhkan pada semaphore dilanjutkan dan menerima kode pengembalian NUSE_SEMAPHORE_WAS_RESET (di Nucleus SE, atau NU_SEMAPHORE_RESET dengan Nucleus RTOS).
Panggilan Nucleus RTOS API untuk Menyetel Ulang Semaphore
Prototipe panggilan layanan:
STATUS NU_Reset_Semaphore(NU_SEMAPHORE *semaphore, jumlah_inisial TIDAK DITANDATANGANI);
Parameter:
semafor – penunjuk ke blok kontrol semaphore yang disediakan pengguna
jumlah_awal – nilai di mana penghitung semaphore akan disetel
Pengembalian:
NU_SUCCESS – panggilan berhasil diselesaikan
NU_INVALID_SEMAPHORE – penunjuk semaphore tidak valid
Panggilan Nucleus SE API untuk Menyetel Ulang Semaphore
Panggilan API ini mendukung fungsionalitas utama dari Nucleus RTOS API.
Prototipe panggilan layanan:
STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE semaphore, U8 initial_count);
Parameter:
semafor – indeks (ID) semaphore yang akan direset
jumlah_awal – nilai di mana penghitung semaphore akan disetel
Pengembalian:
NUSE_SUCCESS – panggilan berhasil diselesaikan
NUSE_INVALID_SEMAPHORE – indeks semaphore tidak valid
Implementasi Nucleus SE dari Semaphore Reset
Tugas utama NUSE_Semaphore_Reset() Fungsi API – setelah pemeriksaan parameter – adalah dengan menyetel entri yang sesuai di NUSE_Semaphore_Counter[] ke nilai awal yang diberikan.
Saat pemblokiran diaktifkan, kode lebih lanjut diperlukan untuk membuka blokir tugas:
sementara (NUSE_Semaphore_Blocking_Count[semaphore] !=0){ indeks U8; /* periksa apakah ada tugas yang diblokir */ /* pada semaphore ini */ for (index=0; index
Setiap tugas yang ditangguhkan di semaphore ditandai sebagai "siap" dengan kode pengembalian penangguhan NUSE_SEMAPHORE_WAS_RESET . Setelah proses ini selesai, jika penjadwal Prioritas sedang digunakan, panggilan dilakukan ke NUSE_Reschedule() , karena satu atau beberapa tugas dengan prioritas lebih tinggi mungkin telah disiapkan dan perlu diizinkan untuk dijalankan.
Informasi Semafor
Panggilan layanan ini memperoleh pilihan informasi tentang semaphore. Implementasi Nucleus SE berbeda dari Nucleus RTOS dalam hal mengembalikan lebih sedikit informasi, karena penamaan objek dan penangguhan pemesanan tidak didukung dan penangguhan tugas mungkin tidak diaktifkan.
Panggilan API Nucleus RTOS untuk Informasi Semaphore
semafor – pointer ke atas blok kontrol semaphore tentang informasi mana yang diminta
nama – penunjuk ke area tujuan 8 karakter untuk nama semaphore; ini termasuk ruang untuk terminator nol
jumlah_saat ini – penunjuk ke variabel, yang akan menerima nilai penghitung semaphore saat ini
suspend_type – penunjuk ke variabel yang menyimpan tipe penangguhan tugas; jenis penangguhan tugas yang valid adalah NU_FIFO dan NU_PRIORITY
tugas_menunggu – penunjuk ke variabel yang akan menerima jumlah tugas yang ditangguhkan pada semaphore ini
tugas_pertama – penunjuk ke variabel bertipe NU_TASK yang akan menerima penunjuk ke blok kontrol dari tugas pertama yang ditangguhkan
Pengembalian:
NU_SUCCESS – panggilan berhasil diselesaikan
NU_INVALID_SEMAPHORE – penunjuk semaphore tidak valid
Panggilan API Nucleus SE untuk Informasi Semaphore
Panggilan API ini mendukung fungsionalitas utama dari Nucleus RTOS API.
Prototipe panggilan layanan:
STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE semaphore, U8 *jumlah_saat ini, U8 *tugas_menunggu, NUSE_TASK *tugas_pertama);
Parameter:
semafor – indeks semaphore tentang informasi mana yang diminta
jumlah_saat ini – penunjuk ke variabel, yang akan menerima nilai penghitung semaphore saat ini
tugas_menunggu – penunjuk ke variabel yang akan menerima jumlah tugas yang ditangguhkan pada semaphore ini (tidak ada yang dikembalikan jika penangguhan tugas dinonaktifkan)
tugas_pertama – penunjuk ke variabel bertipe NUSE_TASK yang akan menerima indeks tugas yang ditangguhkan pertama (tidak ada yang dikembalikan jika penangguhan tugas dinonaktifkan)
Pengembalian:
NUSE_SUCCESS – panggilan berhasil diselesaikan
NUSE_INVALID_SEMAPHORE – indeks semaphore tidak valid
NUSE_INVALID_POINTER – satu atau lebih parameter penunjuk tidak valid
Implementasi Nucleus SE dari Informasi Semaphore
Implementasi panggilan API ini cukup mudah:
NUSE_CS_Enter(); *current_count =NUSE_Semaphore_Counter[semaphore];#jika NUSE_BLOCKING_ENABLE *tasks_waiting =NUSE_Semaphore_Blocking_Count[semaphore]; if (NUSE_Semaphore_Blocking_Count[semaphore] !=0) { indeks U8; for (indeks=0; indeks
Fungsi mengembalikan status semaphore. Kemudian, jika pemblokiran panggilan API diaktifkan, jumlah tugas menunggu dan indeks yang pertama akan dikembalikan (jika tidak, kedua parameter ini disetel ke 0).
Mendapatkan Jumlah Semaphore
Panggilan layanan ini mengembalikan jumlah semaphore yang dikonfigurasi dalam aplikasi. Sementara di Nucleus RTOS ini akan bervariasi dari waktu ke waktu dan nilai yang dikembalikan akan mewakili jumlah semaphore saat ini, di Nucleus SE nilai yang dikembalikan diatur pada waktu pembuatan dan tidak dapat diubah.
Panggilan API Nucleus RTOS untuk Jumlah Semaphore
Prototipe panggilan layanan:
UNSIGNED NU_Established_Semaphores(VOID);
Parameter:
Tidak ada
Pengembalian:
Jumlah semaphore yang dibuat dalam aplikasi
Panggilan API Nucleus SE untuk Jumlah Semaphore
Panggilan API ini mendukung fungsionalitas utama dari Nucleus RTOS API.
Prototipe panggilan layanan:
U8 NUSE_Semaphore_Count(void);
Parameter:
Tidak ada
Pengembalian:
Jumlah semaphore yang dikonfigurasi dalam aplikasi
Implementasi Nucleus SE dari Hitung Semaphore
Implementasi panggilan API ini hampir sederhana:nilai #define simbol NUSE_SEMAPHORE_NUMBER dikembalikan.