
Antrian disebutkan dalam salah satu artikel sebelumnya (# 5). Mereka menyediakan cara yang lebih fleksibel untuk mentransfer pesan sederhana antar tugas dibandingkan dengan kotak surat.
Artikel sebelumnya dalam seri:
Artikel # 22. Kotak Surat: Layanan Tambahan dan Struktur DataArtikel # 21. Kotak Surat: Pengantar dan Layanan DasarArtikel # 20. Semaphores: Layanan Tambahan dan Struktur DataArtikel # 19. Semaphores: pengantar dan layanan dasarArtikel # 18. Grup Bendera Acara: Layanan Pembantu dan Struktur DataArtikel # 17. Grup Bendera Acara: Pengantar dan Layanan DasarArtikel # 16. SinyalArtikel # 15. Partisi Memori: Layanan dan Struktur DataArtikel # 14. Bagian memori: pengantar dan layanan dasarArtikel # 13. Struktur data tugas dan panggilan API yang tidak didukungArtikel # 12. Layanan untuk bekerja dengan tugasArtikel # 11. Tugas: konfigurasi dan pengantar APIArtikel # 10. Penjadwal: fitur canggih dan pelestarian konteksArtikel # 9. Penjadwal: implementasiArtikel # 8. Nucleus SE: Desain dan Penyebaran InternalArtikel # 7. Nucleus SE: PendahuluanArtikel # 6. Layanan RTOS lainnyaArtikel # 5. Interaksi tugas dan sinkronisasiArtikel # 4. Tugas, pengalihan konteks, dan interupsiArtikel # 3. Tugas dan PerencanaanArtikel # 2. RTOS: Struktur dan mode waktu-nyata
Artikel # 1. RTOS: pengantar.Menggunakan Antrian
Dalam Nucleus SE, antrian didefinisikan selama fase build. Aplikasi dapat memiliki hingga 16 antrian. Jika tidak ada antrian dalam aplikasi, struktur data atau kode layanan yang terkait dengan antrian tidak termasuk dalam aplikasi.
Antrian adalah seperangkat area dalam memori yang cukup besar untuk satu elemen jenis
ADDR dan yang dapat diakses dengan aman sehingga beberapa tugas dapat menggunakannya. Tugas dapat menulis data ke antrian sampai semua area penuh. Tugas dapat membaca data dari antrian, dengan data biasanya masuk berdasarkan FIFO (First-in-First-Out). Mencoba untuk menulis data ke antrian yang ramai atau untuk membaca data dari antrian kosong dapat mengakibatkan kesalahan atau jeda tugas, tergantung pada parameter panggilan API yang dipilih dan konfigurasi Nucleus SE.
Antrean dan tautan data
Nucleus SE mendukung saluran data, yang juga disebutkan dalam artikel sebelumnya (# 5) dan akan dibahas secara rinci di salah satu berikut ini. Perbedaan utama antara antrian dan saluran adalah ukuran pesan. Antrian berisi pesan yang terdiri dari satu variabel dari jenis
ADDR (biasanya pointer). Saluran ini berisi pesan-pesan berukuran sewenang-wenang, masing-masing untuk setiap saluran dalam aplikasi dan ditugaskan selama pengaturan parameter.
Pengaturan Antrian
Jumlah antrian
Seperti kebanyakan objek Nucleus SE, konfigurasi antrian terutama dikendalikan oleh arahan
#define dalam file
nuse_config.h . Parameter utama adalah
NUSE_QUEUE_NUMBER , yang menentukan jumlah antrian yang dikonfigurasi dalam aplikasi. Nilai default adalah nol (yaitu, tidak ada antrian dalam aplikasi) dan dapat mengambil nilai hingga 16. Nilai yang salah akan menyebabkan kesalahan selama kompilasi, yang akan dihasilkan selama verifikasi dalam file
nuse_config_check.h (ini termasuk dalam file
nuse_config.c dan dikompilasi bersama dengan itu), yang akan memicu arahan
#error .
Memilih nilai bukan nol berfungsi sebagai aktivator utama untuk antrian. Parameter ini digunakan ketika mendefinisikan struktur data dan ukurannya tergantung pada nilainya (lebih lanjut tentang ini di artikel berikutnya). Selain itu, nilai bukan nol mengaktifkan pengaturan API.
Aktifkan Panggilan API
Setiap fungsi API (panggilan utilitas) di Nucleus SE memiliki
#define directive directive di
nuse_config.h . Untuk antrian, arahan ini adalah:
NUSE_QUEUE_SEND NUSE_QUEUE_RECEIVE NUSE_QUEUE_JAM NUSE_QUEUE_RESET NUSE_QUEUE_INFORMATION NUSE_QUEUE_COUNT
Secara default, mereka diatur ke
FALSE , sehingga menonaktifkan semua panggilan layanan dan memblokir masuknya kode yang mengimplementasikannya. Untuk mengkonfigurasi antrian dalam aplikasi, Anda harus memilih panggilan API yang diperlukan dan mengaturnya ke
TRUE .
Berikut ini adalah cuplikan kode dari file
nuse_config.h :
#define NUSE_QUEUE_NUMBER 0 /* Number of queues in the system - 0-16 */ /* Service call enablers */ #define NUSE_QUEUE_SEND FALSE #define NUSE_QUEUE_RECEIVE FALSE #define NUSE_QUEUE_JAM FALSE #define NUSE_QUEUE_RESET FALSE #define NUSE_QUEUE_INFORMATION FALSE #define NUSE_QUEUE_COUNT FALSE
Jika fungsi API antrian diaktifkan, tetapi tidak ada antrian dalam aplikasi (kecuali untuk
NUSE_Queue_Count () , yang selalu diaktifkan), kesalahan kompilasi akan muncul. Jika kode Anda menggunakan panggilan API yang belum diaktifkan, ini akan menyebabkan kesalahan tata letak karena kode implementasi tidak termasuk dalam aplikasi.
Panggil Antrian
Nucleus RTOS mendukung sepuluh panggilan layanan antrian yang menyediakan fungsionalitas berikut:
- Mengantri pesan. Nucleus SE diimplementasikan dalam fungsi NUSE_Queue_Send () .
- Menerima pesan dari antrian. Nucleus SE mengimplementasikan fungsi NUSE_Queue_Receive () .
- Posting ke kepala antrian. Di Nucleus SE, diterapkan di NUSE_Queue_Jam () .
- Mengembalikan antrian ke status yang tidak digunakan dengan melepaskan semua tugas yang ditangguhkan (reset). Nucleus SE diimplementasikan di NUSE_Queue_Reset () .
- Memberikan informasi tentang antrian tertentu. Nucleus SE diimplementasikan dalam NUSE_Queue_Information () .
- Mengembalikan jumlah antrian yang saat ini dikonfigurasi dalam aplikasi. Di Nucleus SE, diterapkan di NUSE_Queue_Count () .
- Menambahkan antrian baru ke aplikasi (membuat antrian). Nucleus SE tidak diimplementasikan.
- Menghapus antrian dari aplikasi. Nucleus SE tidak diimplementasikan.
- Kembalikan pointer ke semua antrian dalam aplikasi. Nucleus SE tidak diimplementasikan.
- Mengirim pesan ke semua tugas yang ditangguhkan dalam antrian (siaran). Nucleus SE tidak diimplementasikan.
Implementasi dari masing-masing panggilan overhead ini dijelaskan secara rinci di bawah ini.
Panggilan layanan untuk menulis dan membaca dari antrian
Operasi dasar yang dilakukan pada antrian adalah menulis (yang kadang-kadang disebut pesan antrian) dan membaca (juga dikenal sebagai menerima pesan). Dimungkinkan juga untuk menulis ke awal antrian (jamming). Nucleus RTOS dan Nucleus SE menyediakan tiga panggilan API dasar untuk operasi ini, yang akan dibahas di bawah ini.
Antrian
Panggilan utilitas Nucleus RTOS API untuk menulis ke antrian sangat fleksibel dan memungkinkan Anda untuk menjeda tugas secara implisit, atau dengan batas waktu tertentu jika operasi tidak dapat diselesaikan dengan segera (misalnya, ketika mencoba menulis ke antrian penuh). Nucleus SE menyediakan fitur yang sama, tetapi tugas jeda adalah opsional dan batas waktu tidak diterapkan.
Sebut Antrian di Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Send_To_Queue (NU_QUEUE * antrian, pesan VOID *, ukuran TANDA TANGAN, penangguhan TANDA TANGAN);Parameter:
queue - pointer ke blok kontrol antrian yang disediakan oleh pengguna;
message - penunjuk ke pesan yang akan dikirim;
size - jumlah elemen data
TANDA TANGAN dalam pesan. Jika antrian mendukung pesan dengan panjang variabel, parameter ini harus sama dengan ukuran pesan atau kurang dari ukuran pesan yang didukung oleh antrian. Jika antrian mendukung pesan dengan ukuran tetap, parameter ini harus sama persis dengan ukuran pesan yang didukung oleh antrian;
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil nilai
NU_NO_SUSPEND atau
NU_SUSPEND atau nilai batas waktu.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_QUEUE - penunjuk antrian tidak valid;
NU_INVALID_POINTER - null pointer ke pesan (
NULL );
NU_INVALID_SIZE - ukuran pesan tidak sesuai dengan ukuran pesan yang didukung oleh antrian;
NU_INVALID_SUSPEND - penangguhan dilakukan dari utas yang tidak terkait tugas;
NU_QUEUE_FULL - antrian penuh, dan penangguhan tidak ditentukan;
NU_TIMEOUT - antrian penuh bahkan setelah tugas ditangguhkan untuk batas waktu yang ditentukan;
NU_QUEUE_DELETED - antrian dihapus saat tugas ditangguhkan;
NU_QUEUE_RESET - Antrian diatur ulang saat tugas ditangguhkan.
Mengantri pesan di Nucleus SEPanggilan layanan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
STATUS NUSE_Queue_Send (NUSE_QUEUE antrian, pesan ADDR *, U8 ditangguhkan);Parameter:
antrian - indeks
antrian (ID);
message - pointer ke pesan yang akan dikirim; itu adalah salah satu variabel dari jenis
ADDR ;
menangguhkan - spesifikasi untuk menjeda tugas, dapat mengambil nilai
NUSE_NO_SUSPEND atau NUSE_SUSPEND .
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_QUEUE - indeks antrian tidak valid;
NUSE_INVALID_POINTER - null pointer ke pesan (
NULL );
NUSE_INVALID_SUSPEND - berupaya menjeda tugas dari utas yang tidak terkait dengan tugas atau saat panggilan layanan API dinonaktifkan untuk memblokir tugas;
NUSE_QUEUE_FULL - antrian penuh dan penangguhan tidak ditentukan;
NUSE_QUEUE_WAS_RESET - Antrian diatur ulang saat tugas ditangguhkan.
Terapkan Antrian di Nucleus SEVarian kode fungsi API
NUSE_Queue_Send () (setelah memeriksa parameter) dipilih menggunakan kompilasi bersyarat, tergantung pada apakah dukungan untuk penguncian tugas diaktifkan atau tidak. Kami akan mempertimbangkan kedua opsi tersebut.
Jika penguncian tugas tidak diaktifkan, kode untuk panggilan layanan ini cukup sederhana:
if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { return_value = NUSE_QUEUE_FULL; } else /* queue element available */ { NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] = *message; if (NUSE_Queue_Head[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Head[queue] = 0; } NUSE_Queue_Items[queue]++; return_value = NUSE_SUCCESS; }
Fungsi ini hanya memeriksa untuk melihat apakah ada ruang kosong dalam antrian, dan menggunakan indeks
NUSE_Queue_Head [] untuk menyimpan pesan di area data antrian.
Jika penguncian tugas diaktifkan, kode menjadi lebih kompleks:
do { if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_QUEUE_FULL; } else { /* block task */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (queue << 4) | NUSE_QUEUE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* queue element available */ NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] = *message; if (NUSE_Queue_Head[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Head[queue] = 0; } NUSE_Queue_Items[queue]++; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether a task is blocked on this queue */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } } while (suspend == NUSE_SUSPEND);
Beberapa klarifikasi mungkin bermanfaat.
Kode terlampir dalam
do ... while , yang berjalan ketika parameter jeda tugas adalah
NUSE_SUSPEND .
Jika antrian penuh dan
penangguhan adalah
NUSE_NO_SUSPEND , panggilan API berakhir dengan
NUSE_QUEUE_FULL . Jika parameter penangguhan adalah
NUSE_SUSPEND , tugas dihentikan sementara. Setelah selesai (yaitu, ketika tugas dilanjutkan), jika nilai kembali adalah
NUSE_SUCCESS , yaitu, tugas dilanjutkan karena pesan dibaca (dan bukan karena antrian diatur ulang), kode kembali ke awal loop.
Jika antrian tidak penuh, pesan yang disediakan disimpan menggunakan indeks
NUSE_Queue_Head [] di area data antrian. Ia memeriksa untuk melihat apakah ada tugas yang ditangguhkan (pesan menunggu) dalam antrian. Jika ada tugas seperti itu, yang pertama dilanjutkan. Variabel penangguhan diatur ke
NUSE_NO_SUSPEND , dan panggilan API selesai dengan nilai
NUSE_SUCCESS .
Membaca dari antrian
Panggilan utilitas Nucleus RTOS API untuk membaca dari antrian sangat fleksibel dan memungkinkan Anda untuk menjeda tugas secara implisit, atau dengan batas waktu tertentu jika operasi tidak dapat diselesaikan dengan segera (misalnya, ketika mencoba membaca dari antrian kosong). Nucleus SE menyediakan fungsionalitas yang sama, tetapi tugas jeda adalah opsional dan batas waktu tidak diterapkan.
Panggilan untuk menerima pesan dari antrian di Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Receive_From_Queue (NU_QUEUE * pesan, VOID * pesan, ukuran TANDA TANGAN, TANDA TANDA * actual_size, tunda sementara TANDA TANGAN);Parameter:
queue - pointer ke blok kontrol antrian yang disediakan oleh pengguna;
message - pointer ke penyimpanan untuk pesan yang diterima;
size - jumlah elemen data
TANDA TANGAN dalam pesan. Nomor ini harus sesuai dengan ukuran pesan yang ditentukan ketika antrian dibuat;
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil nilai
NU_NO_SUSPEND atau
NU_SUSPEND atau nilai batas waktu.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_QUEUE - penunjuk antrian tidak valid;
NU_INVALID_POINTER - null pointer ke pesan (
NULL );
NU_INVALID_SUSPEND - berupaya menjeda tugas dari utas yang tidak terkait dengan tugas;
NU_QUEUE_EMPTY - antrian kosong, dan penangguhan tidak ditentukan;
NU_TIMEOUT - menunjukkan bahwa antrian masih kosong, bahkan setelah tugas ditangguhkan untuk jangka waktu tertentu;
NU_QUEUE_DELETED - antrian dihapus saat tugas ditangguhkan;
NU_QUEUE_RESET - Antrian diatur ulang saat tugas ditangguhkan.
Panggilan untuk menerima pesan dari Nucleus SE QueuePanggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
STATUS NUSE_Queue_Receive (NUSE_QUEUE antrian, pesan ADDR *, U8 ditangguhkan);Parameter:
antrian - indeks
antrian (ID);
message - pointer ke repositori untuk pesan yang diterima, itu adalah salah satu variabel dari jenis
ADDR ;
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil nilai
NUSE_NO_SUSPEND atau
NUSE_SUSPEND .
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_QUEUE - indeks antrian tidak valid;
NUSE_INVALID_POINTER - null pointer ke pesan (
NULL );
NUSE_INVALID_SUSPEND - upaya untuk menangguhkan tugas dari utas yang tidak terkait dengan tugas atau dengan dukungan yang dinonaktifkan untuk pemblokiran tugas;
NUSE_QUEUE_EMPTY - antrian kosong, dan penangguhan tidak ditentukan;
NUSE_QUEUE_WAS_RESET - Antrian diatur ulang saat tugas ditangguhkan.
Implementasi menerima pesan dari antrian di Nucleus SEVarian kode fungsi API
NUSE_Queue_Receive () (setelah memeriksa parameter) dipilih menggunakan kompilasi bersyarat, tergantung pada apakah dukungan untuk penguncian tugas diaktifkan atau tidak. Pertimbangkan kedua opsi tersebut.
Jika dukungan kunci diaktifkan, kode untuk panggilan API ini cukup sederhana:
if (NUSE_Queue_Items[queue] == 0) /* queue empty */ { return_value = NUSE_QUEUE_EMPTY; } else { /* message available */ *message = NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]++]; if (NUSE_Queue_Tail[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Tail[queue] = 0; } NUSE_Queue_Items[queue]--; return_value = NUSE_SUCCESS; }
Fungsi ini hanya memeriksa untuk melihat apakah ada pesan dalam antrian, dan menggunakan indeks
NUSE_Queue_Tail [] untuk mengambil pesan dari antrian dan mengembalikan data menggunakan pointer ke pesan.
Jika penguncian tugas diaktifkan, kode menjadi lebih kompleks:
do { if (NUSE_Queue_Items[queue] == 0) /* queue empty */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_QUEUE_EMPTY; } else { /* block task */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (queue << 4) | NUSE_QUEUE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* message available */ *message = NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]++]; if (NUSE_Queue_Tail[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Tail[queue] = 0; } NUSE_Queue_Items[queue]--; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether a task is blocked */ /* on this queue */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } } while (suspend == NUSE_SUSPEND);
Beberapa klarifikasi akan sangat membantu.
Kode terlampir dalam
do ... while , yang berjalan ketika parameter jeda tugas adalah
NUSE_SUSPEND .
Jika antriannya kosong dan ditangguhkan adalah
NUSE_NO_SUSPEND , panggilan API berakhir dengan
NUSE_QUEUE_EMPTY . Jika parameter
penangguhan adalah
NUSE_SUSPEND , tugas dihentikan sementara. Setelah selesai (yaitu, ketika tugas dilanjutkan), jika nilai kembali adalah
NUSE_SUCCESS , yaitu, tugas dilanjutkan karena pesan dikirim (dan bukan karena antrian diatur ulang), kode kembali ke awal loop.
Jika antrian berisi pesan, pesan yang disimpan dikembalikan menggunakan indeks
NUSE_Queue_Tail [] . Ia memeriksa untuk melihat apakah ada tugas yang dijeda (tertunda) dalam antrian ini. Jika ada tugas seperti itu, yang pertama dilanjutkan. Variabel penangguhan diatur ke
NUSE_NO_SUSPEND , dan panggilan API berakhir dengan kode
NUSE_SUCCESS .
Menulis ke kepala antrian
Panggilan utilitas Nucleus RTOS API untuk menulis pesan ke kepala antrian sangat fleksibel dan memungkinkan Anda untuk menjeda tugas secara implisit, atau dengan batas waktu tertentu jika operasi tidak dapat diselesaikan dengan segera (misalnya, ketika mencoba menulis ke antrian ramai). Nucleus SE menyediakan fungsionalitas yang sama, tetapi tugas jeda adalah opsional, dan batas waktu tidak diterapkan.
Panggilan untuk menulis pesan ke kepala antrian Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Send_To_Front_Of_Queue (NU_QUEUE * antrian, pesan VOID *, ukuran UNSIGNED, suspend UNSIGNED);Parameter:
queue - pointer ke blok kontrol antrian yang disediakan oleh pengguna;
message - penunjuk ke pesan yang akan dikirim;
size - jumlah elemen data
TANDA TANGAN dalam pesan. Jika antrian mendukung pesan panjang variabel, parameter ini harus sama dengan ukuran pesan atau lebih kecil dari ukuran pesan yang didukung oleh antrian. Jika antrian mendukung pesan dengan panjang tetap, parameter ini harus sama persis dengan ukuran pesan yang didukung oleh antrian;
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil nilai
NU_NO_SUSPEND atau
NU_SUSPEND atau nilai batas waktu.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_QUEUE - penunjuk antrian tidak valid;
NU_INVALID_POINTER - null pointer ke pesan (
NULL );
NU_INVALID_SIZE - ukuran pesan tidak sesuai dengan ukuran pesan yang didukung oleh antrian;
NU_INVALID_SUSPEND - berupaya menjeda dari aliran non-tugas
NU_QUEUE_FULL - antrian penuh, dan penangguhan tidak ditentukan;
NU_TIMEOUT - antrian penuh, bahkan setelah tugas ditangguhkan untuk batas waktu tertentu;
NU_QUEUE_DELETED - antrian dihapus saat tugas ditangguhkan;
NU_QUEUE_RESET - Antrian diatur ulang saat tugas ditangguhkan.
Panggilan untuk menulis pesan ke kepala antrian di Nucleus SEPanggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
STATUS NUSE_Queue_Jam (NUSE_QUEUE antrian, pesan ADDR *, U8 ditangguhkan);Parameter:
antrian - indeks
antrian (ID);
message - pointer ke sebuah pesan, adalah salah satu variabel dari tipe
ADDR ;
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil nilai
NUSE_NO_SUSPEND atau
NUSE_SUSPEND .
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_QUEUE - indeks antrian tidak valid;
NUSE_INVALID_POINTER - null pointer ke pesan (
NULL );
NUSE_INVALID_SUSPEND - upaya untuk menangguhkan tugas dari utas yang tidak terkait dengan tugas atau dengan dukungan yang dinonaktifkan untuk pemblokiran tugas;
NUSE_QUEUE_FULL - antrian penuh dan penangguhan tidak ditentukan;
NUSE_QUEUE_WAS_RESET - Antrian diatur ulang saat tugas ditangguhkan.
Menerapkan Catatan Top Antrian di Nucleus SEVarian kode fungsi API
NUSE_Queue_Jam () sangat mirip dengan
NUSE_Queue_Send () , hanya data yang disimpan menggunakan indeks
NUSE_Queue_Tail [] , dengan demikian:
if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { return_value = NUSE_QUEUE_FULL; } else /* queue element available */ { if (NUSE_Queue_Tail[queue] == 0) { NUSE_Queue_Tail[queue] = NUSE_Queue_Size[queue] - 1; } else { NUSE_Queue_Tail[queue]--; } NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]] = *message; NUSE_Queue_Items[queue]++; return_value = NUSE_SUCCESS; }
Artikel selanjutnya akan melihat panggilan API tambahan yang terkait dengan antrian, serta struktur data.
Tentang Pengarang: Colin Walls telah bekerja di industri elektronik selama lebih dari tiga puluh tahun, mencurahkan sebagian besar waktunya untuk firmware. Dia sekarang adalah seorang insinyur firmware di Mentor Embedded (sebuah divisi dari Mentor Graphics). Colin Walls sering berbicara di konferensi dan seminar, penulis berbagai artikel teknis dan dua buku tentang firmware. Tinggal di Inggris.
Blog profesional
Colin , email: colin_walls@mentor.com.