
Setelah istirahat sebentar, kami terus menerbitkan terjemahan The Whole Truth About RTOS oleh Colin Walls. Kali ini kita akan berbicara tentang saluran transmisi data (selanjutnya disebut saluran), yang telah disebutkan di salah satu artikel sebelumnya, yaitu
di # 5 . Saluran, dibandingkan dengan kotak surat (
# 21 dan
# 22 ) atau antrian (
# 23 dan
# 24 ), menyediakan cara yang lebih fleksibel untuk mentransfer pesan sederhana antar tugas.
Artikel sebelumnya dalam seri:
Artikel # 24. Antrian: layanan tambahan dan struktur dataArtikel # 23. Antrian: pengantar dan layanan dasarArtikel # 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 saluran
Dalam Nucleus SE, saluran diidentifikasi selama fase perakitan. Setiap aplikasi dapat memiliki hingga 16 saluran. Jika tidak ada saluran yang dikonfigurasi dalam aplikasi, struktur data atau kode panggilan layanan yang terkait dengan saluran tidak akan disertakan dalam aplikasi.
Saluran transmisi data - satu set penyimpanan, ukuran masing-masing memungkinkan Anda untuk menempatkan satu elemen data dengan panjang yang ditentukan pengguna dalam byte. Akses ke data dikendalikan sedemikian rupa sehingga beberapa tugas dapat dengan aman menggunakannya. Tugas dapat menulis data ke saluran sampai semua area penuh. Tugas dapat membaca data dari saluran, dan data diterima sesuai dengan prinsip FIFO. Mencoba menulis ke saluran yang ramai atau membaca dari saluran yang kosong dapat mengakibatkan kesalahan atau penangguhan tugas, tergantung pada pengaturan panggilan API yang dipilih dan konfigurasi Nucleus SE.
Saluran dan Antrian
Nucleus SE juga mendukung antrian yang telah dibahas secara rinci dalam artikel sebelumnya (# 23 dan # 24). Perbedaan utama antara saluran dan antrian adalah ukuran pesan. Antrian berisi pesan yang terdiri dari satu variabel 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 saluran
Jumlah saluran
Seperti kebanyakan objek Nucleus SE, kustomisasi saluran dikendalikan oleh arahan
#define di
nuse_config.h . Parameter utama adalah
NUSE_PIPE_NUMBER , yang menentukan jumlah saluran yang dikonfigurasi dalam aplikasi. Secara default, nilai ini adalah nol (yaitu, tidak ada saluran dalam aplikasi) dan dapat mengambil nilai hingga 16. Nilai yang salah akan menyebabkan kesalahan kompilasi, yang akan dihasilkan dengan memeriksa file
nuse_config_check.h (file ini termasuk dalam
nuse_config.c dan kompilasi bersamaan dengan itu), yang akan memicu arahan
#error .
Memilih nilai bukan nol berfungsi sebagai penggerak utama saluran. Parameter ini digunakan untuk menentukan 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 pengaktif di
nuse_config.h . Untuk saluran, simbol-simbol ini adalah:
NUSE_PIPE_SENDNUSE_PIPE_RECEIVENUSE_PIPE_JAMNUSE_PIPE_RESETNUSE_PIPE_INFORMATIONNUSE_PIPE_COUNTSecara default, mereka disetel ke
FALSE , sehingga semua panggilan layanan dinonaktifkan, memblokir penyertaan kode yang mengimplementasikannya. Untuk mengonfigurasi saluran dalam aplikasi, Anda harus memilih panggilan layanan API yang diperlukan dan mengaturnya ke
TRUE .
Di bawah ini adalah potongan kode dari file
nuse_config.h default.
#define NUSE_PIPE_NUMBER 0 /* Number of pipes in the system - 0-16 */ /* Service call enablers */ #define NUSE_PIPE_SEND FALSE #define NUSE_PIPE_RECEIVE FALSE #define NUSE_PIPE_JAM FALSE #define NUSE_PIPE_RESET FALSE #define NUSE_PIPE_INFORMATION FALSE #define NUSE_PIPE_COUNT FALSE
Jika fungsi API diaktifkan, tetapi tidak ada saluran dalam aplikasi (kecuali
NUSE_Pipe_Count () , yang selalu diaktifkan), kesalahan kompilasi akan terjadi. Jika kode Anda menggunakan panggilan API yang belum diaktifkan, kesalahan tata letak akan terjadi karena kode implementasi tidak termasuk dalam aplikasi.
Panggilan saluran overhead
Nucleus RTOS mendukung sepuluh saluran overhead yang menyediakan fungsi berikut:
- Mengirim pesan ke saluran. Nucleus SE diimplementasikan dalam fungsi NUSE_Pipe_Send () .
- Terima pesan dari saluran. Nucleus SE diimplementasikan dalam fungsi NUSE_Pipe_Receive () .
- Kirim pesan ke bagian atas saluran. Nucleus SE diimplementasikan dalam NUSE_Pipe_Jam () .
- Mengembalikan saluran ke kondisi yang tidak digunakan dengan melepaskan semua tugas yang ditangguhkan (reset). Di Nucleus SE, diterapkan di NUSE_Pipe_Reset () .
- Mendapatkan informasi tentang saluran tertentu. Nucleus SE diimplementasikan menggunakan NUSE_Pipe_Information () .
- Mengembalikan penghitung saluran yang saat ini dikonfigurasi dalam aplikasi. Nucleus SE diimplementasikan menggunakan NUSE_Pipe_Count () .
- Menambahkan saluran baru ke aplikasi (pembuatan). Tidak diterapkan di Nucleus SE.
- Menghapus saluran dari aplikasi. Tidak diterapkan di Nucleus SE.
- Kembalikan pointer ke semua saluran dalam aplikasi. Tidak diterapkan di Nucleus SE.
- Mengirim pesan ke semua tugas yang ditangguhkan di saluran (siaran). Tidak diterapkan di Nucleus SE.
Pertimbangkan implementasi dari masing-masing panggilan layanan ini secara lebih rinci.
Panggilan layanan untuk menulis dan membaca dari saluran
Operasi dasar yang dilakukan pada saluran adalah merekam (juga disebut mengirim) dan membaca (juga dikenal sebagai menerima pesan). Selain itu, dimungkinkan untuk merekam data di awal saluran (macet). Nucleus RTOS dan Nucleus SE menyediakan tiga panggilan API utama untuk operasi ini, yang akan dibahas di bawah ini.
Rekaman saluran
Panggilan utilitas Nucleus RTOS API untuk menulis ke saluran sangat fleksibel, yang memungkinkan Anda untuk menjeda tugas secara implisit atau dengan batas waktu jika operasi tidak dapat diselesaikan segera (misalnya, ketika mencoba menulis ke saluran yang ramai). Nucleus SE memiliki tantangan yang serupa, tetapi tugas jeda adalah opsional dan batas waktu tidak diterapkan.
Nucleus RTOS juga menyediakan layanan siaran saluran, tetapi tidak didukung pada Nucleus SE. Ini akan dijelaskan di bagian Panggilan API yang belum direalisasi pada artikel berikutnya.
Panggilan untuk mengirim pesan ke saluran di Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Send_To_Pipe (NU_PIPE * pipa, pesan VOID *, ukuran TIDAK DITANDATANGANI, penangguhan tidak ditandatangani);Parameter:
pipe - pointer ke blok kontrol saluran yang disediakan oleh pengguna;
message - penunjuk ke pesan yang akan dikirim;
size - jumlah byte dalam pesan. Jika saluran mendukung pesan panjang variabel, parameter ini harus sama dengan atau kurang dari panjang pesan yang didukung oleh saluran. Jika saluran mendukung pesan dengan panjang tetap, parameter ini harus sama dengan ukuran pesan yang didukung oleh saluran;
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil nilai
NU_NO_SUSPEND ,
NU_SUSPEND atau nilai batas waktu.
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_PIPE - pointer tidak valid ke saluran;
NU_INVALID_POINTER - null pointer ke pesan (
NULL );
NU_INVALID_SIZE - ukuran pesan tidak kompatibel dengan ukuran pesan yang didukung oleh saluran;
NU_INVALID_SUSPEND - upaya untuk menangguhkan dari utas yang tidak terkait tugas;
NU_PIPE_FULL - saluran sudah penuh dan jenis penangguhan tugas tidak ditentukan;
NU_TIMEOUT - saluran penuh bahkan setelah tugas ditangguhkan untuk jangka waktu tertentu;
NU_PIPE_DELETED - saluran telah dihapus saat tugas ditangguhkan;
NU_PIPE_RESET - Saluran diatur ulang saat tugas ditangguhkan.
Panggilan untuk mengirim pesan ke saluran di Nucleus SEPanggilan layanan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
STATUS NUSE_Pipe_Send (pipa NUSE_PIPE, pesan U8 *, U8 ditangguhkan);Parameter:
pipa - indeks (ID) dari saluran yang digunakan;
message - pointer ke pesan yang akan dikirim (urutan byte panjang yang diizinkan untuk saluran tertentu);
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil nilai
NUSE_NO_SUSPEND dan
NUSE_SUSPEND .
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_PIPE - indeks saluran tidak valid;
NUSE_INVALID_POINTER - null pointer ke pesan (
NULL );
NUSE_INVALID_SUSPEND - upaya untuk menangguhkan dari utas yang tidak terkait tugas atau ketika penguncian tugas dinonaktifkan;
NUSE_PIPE_FULL - saluran sudah penuh dan jenis penangguhan tugas tidak ditentukan;
NUSE_PIPE_WAS_RESET - Saluran diatur ulang saat tugas ditangguhkan.
Menerapkan posting saluran di Nucleus SEVersi kode fungsi API
NUSE_Pipe_Send () (setelah memeriksa parameter) dipilih menggunakan kompilasi bersyarat tergantung pada apakah dukungan untuk panggilan API diaktifkan untuk memblokir (jeda) tugas atau tidak. Di bawah ini kami mempertimbangkan kedua opsi.
Jika kunci dinonaktifkan, kode untuk panggilan API ini cukup sederhana:
if (NUSE_Pipe_Items[pipe] == NUSE_Pipe_Size[pipe]) /* pipe full */ { return_value = NUSE_PIPE_FULL; } else /* pipe element available */ { data = &NUSE_Pipe_Data[pipe][NUSE_Pipe_Head[pipe]]; for (i=0; i<msgsize; i++) { *data++ = *message++; } NUSE_Pipe_Head[pipe] += msgsize; if (NUSE_Pipe_Head[pipe] == (NUSE_Pipe_Size[pipe] * msgsize)) { NUSE_Pipe_Head[pipe] = 0; } NUSE_Pipe_Items[pipe]++; return_value = NUSE_SUCCESS; }
Fungsi ini memeriksa apakah ada ruang kosong di saluran dan menggunakan indeks
NUSE_Pipe_Head [] untuk menempatkan pesan di area data saluran.
Jika penguncian tugas diaktifkan, kode menjadi lebih kompleks:
do { if (NUSE_Pipe_Items[pipe] == NUSE_Pipe_Size[pipe]) /* pipe full */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_PIPE_FULL; } else { /* block task */ NUSE_Pipe_Blocking_Count[pipe]++; NUSE_Suspend_Task(NUSE_Task_Active, (pipe << 4) | NUSE_PIPE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else /* pipe element available */ { data = &NUSE_Pipe_Data[pipe][NUSE_Pipe_Head[pipe]]; for (i=0; i<msgsize; i++) { *data++ = *message++; } NUSE_Pipe_Head[pipe] += msgsize; if (NUSE_Pipe_Head[pipe] == (NUSE_Pipe_Size[pipe] * msgsize)) { NUSE_Pipe_Head[pipe] = 0; } NUSE_Pipe_Items[pipe]++; if (NUSE_Pipe_Blocking_Count[pipe] != 0) { U8 index; /* check whether a task is blocked on this pipe */ NUSE_Pipe_Blocking_Count[pipe]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_PIPE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == pipe)) { 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 saluran penuh dan parameter penangguhan adalah
NUSE_NO_SUSPEND , panggilan API berakhir dengan nilai
NUSE_PIPE_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 saluran diatur ulang), kode kembali ke awal loop.
Jika saluran tidak penuh, pesan yang disediakan disimpan menggunakan indeks
NUSE_Pipe_Head [] di area data saluran. Ia memeriksa untuk melihat apakah saluran telah menjeda tugas (pesan yang ditangguhkan). 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 saluran
Panggilan utilitas Nucleus RTOS API untuk membaca dari saluran sangat fleksibel, yang memungkinkan Anda untuk menjeda tugas secara implisit atau dengan batas waktu jika operasi tidak dapat diselesaikan dengan segera (misalnya, ketika Anda mencoba membaca saluran kosong). Nucleus SE memiliki panggilan utilitas yang serupa, tetapi tugas jeda adalah opsional dan batas waktu tidak diterapkan.
Tantangan Baca Saluran di RTOS IntiPrototipe panggilan layanan:
STATUS NU_Receive_From_Pipe (NU_PIPE * pipa, pesan VOID *, ukuran TANDA TANGAN, TANDA TANDA * actual_size, tunda sementara TANDA TANGAN);Parameter:
pipe - pointer ke blok kontrol saluran yang disediakan oleh pengguna;
message - pointer ke penyimpanan untuk pesan yang diterima;
size - jumlah byte dalam pesan. Harus cocok dengan ukuran pesan yang ditentukan saat membuat saluran;
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil
NU_NO_SUSPEND ,
NU_SUSPEND atau nilai batas waktu.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_PIPE - pointer tidak valid ke saluran;
NU_INVALID_POINTER - null pointer ke pesan (
NULL );
NU_INVALID_SUSPEND - berupaya menjeda tugas dari utas yang tidak terkait dengan tugas;
NU_PIPE_EMPTY - salurannya kosong, dan jenis penangguhan tugas tidak ditentukan;
NU_TIMEOUT - saluran kosong bahkan setelah tugas ditangguhkan untuk nilai batas waktu yang ditentukan;
NU_PIPE_DELETED - saluran telah dihapus saat tugas ditangguhkan;
NU_PIPE_RESET - Saluran dihapus saat tugas ditangguhkan.
Tantangan Baca Saluran di Nucleus SEPanggilan layanan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
STATUS NUSE_Pipe_Receive (pipa NUSE_PIPE, pesan U8 *, U8 ditangguhkan);Parameter:
pipa - indeks (ID) dari saluran yang digunakan;
message - pointer ke penyimpanan untuk pesan yang diterima (urutan byte, panjangnya bertepatan dengan ukuran pesan saluran);
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil nilai
NUSE_NO_SUSPEND dan
NU_SUSPEND .
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_PIPE - indeks saluran 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 untuk penangguhan tugas yang dinonaktifkan;
NUSE_PIPE_EMPTY - salurannya kosong, dan jenis penangguhan tugas tidak ditentukan;
NUSE_PIPE_WAS_RESET - Saluran diatur ulang saat tugas ditangguhkan.
Menerapkan pembaca feed di Nucleus SEVersi kode fungsi API
NUSE_Pipe_Receive () (setelah memeriksa parameter) dipilih oleh kompilasi bersyarat, tergantung pada apakah dukungan API untuk panggilan kunci (penangguhan tugas) diaktifkan atau tidak. Kami akan mempertimbangkan kedua opsi di bawah ini.
Jika kunci dinonaktifkan, kode untuk panggilan API ini cukup sederhana:
if (NUSE_Pipe_Items[pipe] == 0) /* pipe empty */ { return_value = NUSE_PIPE_EMPTY; } else { /* message available */ data = &NUSE_Pipe_Data[pipe][NUSE_Pipe_Tail[pipe]]; for (i=0; i<msgsize; i++) { *message++ = *data++; } NUSE_Pipe_Tail[pipe] += msgsize; if (NUSE_Pipe_Tail[pipe] == (NUSE_Pipe_Size[pipe] * msgsize)) { NUSE_Pipe_Tail[pipe] = 0; } NUSE_Pipe_Items[pipe]--; *actual_size = msgsize; return_value = NUSE_SUCCESS; }
Fungsi memeriksa keberadaan pesan di saluran dan menggunakan indeks
NUSE_Pipe_Tail [] untuk mendapatkan pesan dari area data saluran, dan mengembalikan data melalui penunjuk pesan.
Jika penguncian tugas diaktifkan, kode menjadi lebih kompleks:
do { if (NUSE_Pipe_Items[pipe] == 0) /* pipe empty */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_PIPE_EMPTY; } else { /* block task */ NUSE_Pipe_Blocking_Count[pipe]++; NUSE_Suspend_Task(NUSE_Task_Active, (pipe << 4) | NUSE_PIPE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* message available */ data = &NUSE_Pipe_Data[pipe][NUSE_Pipe_Tail[pipe]]; for (i=0; i<msgsize; i++) { *message++ = *data++; } NUSE_Pipe_Tail[pipe] += msgsize; if (NUSE_Pipe_Tail[pipe] == (NUSE_Pipe_Size[pipe] * msgsize)) { NUSE_Pipe_Tail[pipe] = 0; } NUSE_Pipe_Items[pipe]--; if (NUSE_Pipe_Blocking_Count[pipe] != 0) { U8 index; /* check whether a task is blocked */ /* on this pipe */ NUSE_Pipe_Blocking_Count[pipe]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_PIPE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == pipe)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } *actual_size = msgsize; 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 saluran kosong dan parameter penangguhan adalah
NUSE_NO_SUSPEND , panggilan API berakhir dengan nilai
NUSE_PIPE_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 saluran diatur ulang), kode kembali ke awal loop.
Jika saluran berisi pesan, pesan yang disimpan dikembalikan menggunakan indeks
NUSE_Pipe_Tail [] . Memeriksa apakah ada tugas yang dijeda (menunggu untuk dikirim) di saluran ini. Jika ada tugas seperti itu, yang pertama dilanjutkan. Variabel penangguhan diatur ke
NUSE_NO_SUSPEND , dan panggilan API berakhir dengan kode
NUSE_SUCCESS .
Rekam ke awal saluran
Panggilan utilitas Nucleus RTOS API untuk menulis ke awal saluran sangat fleksibel, yang memungkinkan Anda untuk menjeda tugas secara implisit atau dengan batas waktu jika operasi tidak dapat diselesaikan dengan segera (misalnya, ketika mencoba menulis ke saluran penuh). Nucleus SE memiliki panggilan utilitas yang serupa, tetapi tugas jeda adalah opsional dan batas waktu tidak diterapkan.
Panggilan untuk menulis ke awal saluran di Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Send_To_Front_Of_Pipe (NU_PIPE * pipa, pesan VOID *, ukuran TIDAK DITANDATANGANI, penangguhan yang TIDAK DIKETAHUI);Parameter:
pipe - pointer ke blok kontrol saluran yang disediakan oleh pengguna;
message - penunjuk ke pesan yang akan dikirim;
size - jumlah byte dalam pesan. Jika saluran mendukung pesan panjang variabel, parameter ini harus sama dengan atau kurang dari ukuran pesan yang didukung oleh saluran. Jika saluran mendukung pesan panjang tetap, parameter ini harus cocok dengan ukuran pesan yang didukung oleh saluran;
menangguhkan - spesifikasi penangguhan tugas, dapat mengambil
NU_NO_SUSPEND ,
NU_SUSPEND atau nilai batas waktu.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_PIPE - pointer tidak valid ke saluran;
NU_INVALID_POINTER - null pointer ke pesan (
NULL );
NU_INVALID_SIZE - ukuran pesan tidak sesuai dengan ukuran pesan yang didukung oleh saluran;
NU_INVALID_SUSPEND - upaya untuk menangguhkan dari utas yang tidak terkait dengan tugas;
NU_PIPE_FULL - salurannya penuh, dan jenis penangguhan tugas tidak ditentukan;
NU_TIMEOUT - saluran penuh bahkan setelah tugas ditangguhkan untuk jangka waktu tertentu;
NU_PIPE_DELETED - saluran telah dihapus saat tugas ditangguhkan;
NU_PIPE_RESET - Saluran diatur ulang saat tugas ditangguhkan.
Panggilan untuk menulis ke awal saluran di Nucleus SEPanggilan utilitas ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
STATUS NUSE_Pipe_Jam (pipa NUSE_PIPE, pesan ADDR *, U8 ditangguhkan);Parameter:
pipa - indeks (ID) dari saluran yang digunakan;
message - pointer ke pesan yang akan dikirim, yang merupakan urutan byte yang sama dengan ukuran pesan yang dikonfigurasi di saluran;
menangguhkan - spesifikasi penangguhan tugas, dapat berupa
NUSE_NO_SUSPEND atau
NUSE_SUSPEND .
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_PIPE - indeks saluran 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 saat kunci tugas dinonaktifkan;
NUSE_PIPE_FULL - salurannya penuh, dan jenis penangguhan tugas tidak ditentukan;
NUSE_PIPE_WAS_RESET - Saluran diatur ulang saat tugas ditangguhkan.
Menerapkan Perekaman Entri Saluran di Nucleus SEKode varian fungsi
NUSE_Pipe_Jam () sangat mirip dengan
NUSE_Pipe_Send () , kecuali bahwa indeks
NUSE_Pipe_Tail [] digunakan untuk menyimpan data di dalamnya, oleh karena itu:
if (NUSE_Pipe_Items[pipe] == NUSE_Pipe_Size[pipe]) /* pipe full */ { return_value = NUSE_PIPE_FULL; } else /* pipe element available */ { if (NUSE_Pipe_Tail[pipe] == 0) { NUSE_Pipe_Tail[pipe] = (NUSE_Pipe_Size[pipe] - 1) * msgsize; } else { NUSE_Pipe_Tail[pipe] -= msgsize; } data = &NUSE_Pipe_Data[pipe][NUSE_Pipe_Tail[pipe]]; for (i=0; i<msgsize; i++) { *data++ = *message++; } NUSE_Pipe_Items[pipe]++; return_value = NUSE_SUCCESS; }
Pada artikel berikutnya, kami akan mempertimbangkan panggilan layanan tambahan yang terkait dengan saluran, serta struktur data yang sesuai.
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.