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

Semafor dalam Nucleus SE: Ringkasan, Konfigurasi, dan Esensial API

Semafor dalam Nucleus SE: Ringkasan, Konfigurasi, dan Esensial API
Lihat seri RTOS Revealed

Semafor adalah mekanisme dasar untuk menyinkronkan akses ke sumber daya bersama dalam sistem tertanam. Mereka memungkinkan tugas untuk dengan aman mendapatkan dan melepaskan kontrol atas sumber daya tanpa konflik.

Menggunakan Semafor

Dalam Nucleus SE, dukungan semafor diaktifkan selama proses build. Satu aplikasi dapat mengonfigurasi hingga 16 semafor. Jika Anda memilih untuk tidak menggunakan semafor, struktur data dan kode API terkait dikecualikan dari biner akhir, mengurangi jejak.

Semafor hanyalah counter 8-bit yang nilainya dilindungi sehingga beberapa tugas dapat memanipulasinya dengan aman. Tugas memanggil Obtain untuk menurunkan counter dan Release untuk meningkatkannya. Jika tugas mencoba untuk mendapatkan semafor yang counter-nya nol, hasilnya tergantung pada opsi API dan konfigurasi sistem: panggilan mungkin mengembalikan kesalahan atau menunda tugas sampai semafor tersedia.

Mengonfigurasi Semafor

Jumlah Semafor

Semafor didefinisikan melalui pernyataan #define dalam nuse_config.h. Makro kunci adalah NUSE_SEMAPHORE_NUMBER, yang menentukan berapa banyak slot semafor yang akan digunakan aplikasi. Nilai default adalah 0, yang berarti tidak ada dukungan semafor. Nilai yang valid berkisar dari 0 hingga 16. Nilai yang tidak valid memicu kesalahan waktu kompilasi yang dihasilkan oleh nuse_config_check.h (termasuk melalui nuse_config.c).

Mengatur NUSE_SEMAPHORE_NUMBER ke nilai non-nol mengaktifkan subsistem semafor: struktur data diukur sesuai, dan simbol yang mengaktifkan API diproses.

API Enables

Setiap panggilan API Nucleus SE dipelihara oleh makro pengaktif yang khusus dalam nuse_config.h. Untuk semafor, simbol yang relevan adalah:

Secara default, semua makro ini diatur ke FALSE, yang menonaktifkan panggilan layanan yang sesuai dan mengecualikan implementasinya dari build. Untuk mengaktifkan API tertentu, atur makronya ke TRUE.

Berikut adalah cuplikan dari file nuse_config.h default:

#define NUSE_SEMAPHORE_NUMBER 0 /* Jumlah semafor dalam sistem – 0‑16 */ #define NUSE_SEMAPHORE_OBTAIN FALSE /* Pengaktif panggilan layanan */ #define NUSE_SEMAPHORE_RELEASE FALSE /* Pengaktif panggilan layanan */ #define NUSE_SEMAPHORE_RESET FALSE /* Pengaktif panggilan layanan */ #define NUSE_SEMAPHORE_INFORMATION FALSE /* Pengaktif panggilan layanan */ #define NUSE_SEMAPHORE_COUNT FALSE /* Pengaktif panggilan layanan */

Mengaktifkan panggilan API tanpa mengonfigurasi semafor apa pun (kecuali NUSE_Semaphore_Count(), yang selalu tersedia) menghasilkan kesalahan waktu kompilasi. Jika Anda memanggil API yang belum diaktifkan, kesalahan waktu link akan terjadi karena implementasi dihilangkan.

Panggilan Layanan Semafor

Nucleus SE menawarkan delapan panggilan layanan terkait semafor. Lima pertama sepenuhnya diimplementasikan; tiga yang tersisa adalah placeholder untuk ekstensi di masa depan.

Operasi Obtain dan Release

Operasi inti semafor adalah obtain (mengurangi) dan release (menambah). Nucleus RTOS menyediakan API obtain yang fleksibel dengan penangguhan dan timeout opsional. Nucleus SE mencerminkan perilaku ini, meskipun penangguhan tugas opsional dan timeout tidak didukung.

API Obtain Nucleus RTOS

Prototipe:

STATUS NU_Obtain_Semaphore(NU_SEMAPHORE *semaphore, UNSIGNED suspend);

Parameter:

semaphore – pointer ke blok kontrol semafor.

suspend – dapat berupa NU_NO_SUSPEND, NU_SUSPEND, atau nilai timeout.

Nilai kembali:

NU_SUCCESS – operasi berhasil.

NU_UNAVAILABLE – nilai semafor nol.

NU_INVALID_SEMAPHORE – pointer semafor tidak valid.

NU_INVALID_SUSPEND – penangguhan dicoba dari konteks non-tugas.

NU_SEMAPHORE_WAS_RESET – semafor di-reset saat tugas tertunda.

API Obtain Nucleus SE

Prototipe:

STATUS NUSE_Semaphore_Obtain(NUSE_SEMAPHORE semaphore, U8 suspend);

Parameter:

semaphore – indeks semafor.

suspend – dapat berupa NUSE_NO_SUSPEND atau NUSE_SUSPEND.

Nilai kembali:

NUSE_SUCCESS – operasi berhasil.

NUSE_UNAVAILABLE – nilai semafor nol.

NUSE_INVALID_SEMAPHORE – indeks semafor tidak valid.

NUSE_INVALID_SUSPEND – penangguhan dicoba dari non-tugas atau API blokir dinonaktifkan.

NUSE_SEMAPHORE_WAS_RESET – semafor di-reset selama penangguhan.

Cuplikan Implementasi

Ketika blokir dinonaktifkan, implementasi hanya memeriksa apakah counter non-nol, menguranginya, dan mengembalikan NUSE_SUCCESS. Jika counter nol, ia mengembalikan NUSE_UNAVAILABLE.

if (NUSE_Semaphore_Counter[semaphore] != 0) { NUSE_Semaphore_Counter[semaphore]--; return_value = NUSE_SUCCESS; } else { return_value = NUSE_UNAVAILABLE; }
Ketika blokir diaktifkan, rutin memasuki loop do…while yang mencoba mendapatkan semafor. Jika counter nol dan suspend adalah NUSE_SUSPEND, tugas diblokir. Setelah release, tugas pertama yang menunggu dibangunkan dan loop mencoba mendapatkan kembali.
do { if (NUSE_Semaphore_Counter[semaphore] != 0) { NUSE_Semaphore_Counter[semaphore]--; return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } else { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_UNAVAILABLE; } else { NUSE_Semaphore_Blocking_Count[semaphore]++; NUSE_Suspend_Task(NUSE_Task_Active, semaphore << 4 | NUSE_SEMAPHORE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } } while (suspend == NUSE_SUSPEND);

API Release Nucleus RTOS

Prototipe:

STATUS NU_Release_Semaphore(NU_SEMAPHORE *semaphore);

Parameter:

semaphore – pointer ke blok kontrol semafor.

Nilai kembali:

NU_SUCCESS – operasi berhasil.

NU_INVALID_SEMAPHORE – pointer semafor tidak valid.

API Release Nucleus SE

Prototipe:

STATUS NUSE_Semaphore_Release(NUSE_SEMAPHORE semaphore);

Parameter:

semaphore – indeks semafor.

Nilai kembali:

NUSE_SUCCESS – operasi berhasil.

NUSE_INVALID_SEMAPHORE – indeks semafor tidak valid.

NUSE_UNAVAILABLE – counter sudah di 255; tidak dapat ditambah.

Cuplikan Implementasi

Rutin release pertama memeriksa apakah counter di bawah maksimum (255). Jika demikian, ia meningkatkan counter. Jika blokir diaktifkan dan ada tugas yang menunggu pada semafor ini, yang pertama dibangunkan.

NUSE_CS_Enter(); if (NUSE_Semaphore_Counter[semaphore] < 255) { NUSE_Semaphore_Counter[semaphore]++; return_value = NUSE_SUCCESS; #if NUSE_BLOCKING_ENABLE if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { NUSE_Semaphore_Blocking_Count[semaphore]--; for (U8 index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } #endif } else { return_value = NUSE_UNAVAILABLE; } NUSE_CS_Exit(); return return_value;

Ketika tugas tertunda pada semafor, release-nya membangunkan tugas pertama yang menunggu, memungkinkannya melanjutkan eksekusi.

Artikel berikutnya akan menjelajahi grup flag event dan struktur data terkait.


Colin Walls memiliki lebih dari tiga puluh tahun pengalaman di industri elektronik, terutama berfokus pada perangkat lunak tertanam. Ia sering presentasi di konferensi, menulis artikel teknis, dan menulis dua buku tentang perangkat lunak tertanam. Colin adalah teknolog perangkat lunak tertanam dengan Mentor Embedded (Divisi Perangkat Lunak Tertanam Mentor Graphics) dan berkantor di Inggris. Blognya di https://blogs.mentor.com/colinwalls. Hubungi melalui email di colin_walls@mentor.com.


Tertanam

  1. Cam Locks Dijelaskan: Cara Mengamankan Lemari dengan Discret
  2. Apa Itu Eye Screws? Panduan Profesional tentang Desain dan Penggunaan
  3. Baja Stainless Dijelaskan: Komposisi, Produksi, dan Dampak Global
  4. Dasar-Dasar C#: Esensial Input dan Output
  5. Penulis Layanan Otomotif: Peran, Tugas, dan Jalur Karir
  6. Kotak Surat dalam Nucleus SE: Panduan Praktis Konfigurasi dan Penggunaan
  7. Semafor dalam Nucleus RTOS: Layanan Utilitas & Struktur Data
  8. Menguasai Grup Flag Event: Layanan Utilitas & Struktur Data di Nucleus RTOS/SE
  9. Grup Flag Event di Nucleus SE: Panduan Pengantar untuk Konfigurasi dan Penggunaan API
  10. Antrian di Nucleus SE: Pengantar dan Panggilan Layanan Inti