Seluruh kebenaran tentang RTOS. Artikel # 23. Antrian: pengantar dan layanan dasar



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 Data
Artikel # 21. Kotak Surat: Pengantar dan Layanan Dasar
Artikel # 20. Semaphores: Layanan Tambahan dan Struktur Data
Artikel # 19. Semaphores: pengantar dan layanan dasar
Artikel # 18. Grup Bendera Acara: Layanan Pembantu dan Struktur Data
Artikel # 17. Grup Bendera Acara: Pengantar dan Layanan Dasar
Artikel # 16. Sinyal
Artikel # 15. Partisi Memori: Layanan dan Struktur Data
Artikel # 14. Bagian memori: pengantar dan layanan dasar
Artikel # 13. Struktur data tugas dan panggilan API yang tidak didukung
Artikel # 12. Layanan untuk bekerja dengan tugas
Artikel # 11. Tugas: konfigurasi dan pengantar API
Artikel # 10. Penjadwal: fitur canggih dan pelestarian konteks
Artikel # 9. Penjadwal: implementasi
Artikel # 8. Nucleus SE: Desain dan Penyebaran Internal
Artikel # 7. Nucleus SE: Pendahuluan
Artikel # 6. Layanan RTOS lainnya
Artikel # 5. Interaksi tugas dan sinkronisasi
Artikel # 4. Tugas, pengalihan konteks, dan interupsi
Artikel # 3. Tugas dan Perencanaan
Artikel # 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 RTOS

Prototipe 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 SE
Panggilan 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 SE
Varian 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 RTOS
Prototipe 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 Queue
Panggilan 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 SE
Varian 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 RTOS
Prototipe 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 SE
Panggilan 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 SE
Varian 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.

Source: https://habr.com/ru/post/id431378/


All Articles