
Kami terus meninjau layanan RTOS yang memberikan informasi tambahan tentang tugas dan operasi bersama mereka.
Panggilan API tambahan yang terkait dengan tugas termasuk panggilan untuk mendapatkan ID tugas, memeriksa ukuran tumpukan, mengatur ulang tugas, mendapatkan informasi tentang tugas, dan menentukan jumlah tugas dalam sistem. Nucleus RTOS dan Nucleus SE menyediakan 4 panggilan API utama untuk operasi ini, yang akan saya bahas dalam artikel ini.
Artikel sebelumnya dalam seri:
Artikel # 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.
Mendapatkan ID dari tugas saat ini
Panggilan utilitas ini mengembalikan ID tugas yang dipanggil. Untuk Nucleus RTOS, ini adalah penunjuk ke unit kontrol tugas saat ini. Untuk Nucleus SE, indeks (0-15) dari tugas saat ini.
Memanggil tugas saat ini di Nucleus RTOSPrototipe panggilan layanan:
NU_TASK * NU_Current_Task_Pointer (VOID);Parameter:
Tidak ada.
Nilai pengembalian:
Pointer ke unit kontrol dari tugas saat ini;
NU_NULL - tidak ada tugas yang dilakukan.
Menantang tugas yang sedang berlangsung di Nucleus SEPanggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
NUSE_TASK NUSE_Task_Current (batal);Parameter:
Tidak ada.
Nilai pengembalian:
Indeks tugas saat ini (disebut).
Selesaikan tugas yang sedang berlangsung di Nucleus SEImplementasi panggilan API dalam kasus ini cukup sederhana: nilai variabel global
NUSE_Task_Active dikembalikan .
Memeriksa Ukuran Stack Yang Tersedia
Panggilan utilitas ini mengembalikan ukuran tumpukan yang tersedia (dalam byte) untuk tugas saat ini. Ini hanya disarankan untuk perencana, di mana setiap tugas memiliki tumpukan sendiri; yaitu Tidak cocok untuk penjadwal Run To Completion (RTC) di Nucleus SE.
Mengingat Informasi Stack Volume di Nucleus RTOSPrototipe panggilan layanan:
NU_Task_Check_Stack (VOID) TIDAK DITANDATANGANI;Parameter:
Tidak ada.
Nilai pengembalian:
Ukuran ukuran tumpukan yang tersedia untuk tugas saat ini dalam byte.
Mengingat Informasi Ukuran Tumpukan di Nucleus SEPanggilan API ini mendukung fungsionalitas inti API Nucleus RTOS. Namun, Nucleus SE membutuhkan parameter formal (dummy) untuk membuatnya lebih mudah untuk mendapatkan nilai pointer ke stack yang digunakan.
Prototipe panggilan layanan:
U16 NUSE_Task_Check_Stack (dummy U8);Parameter:
dummy - nilai apa pun, karena sebenarnya itu tidak digunakan.
Nilai pengembalian:
Ukuran ukuran tumpukan yang tersedia untuk tugas saat ini dalam byte.
ImplementasiUntuk panggilan seperti itu, kode harus portabel:

Jika penjadwal RTC digunakan, nilai kembali adalah 0 karena tidak mungkin (menggunakan kode portabel) untuk menentukan ruang tumpukan yang tersedia untuk tugas tersebut.
Dalam kasus lain, nilai penunjuk tumpukan ditentukan dengan menemukan alamat parameter dummy, yang akan ditempatkan hampir di awal tumpukan. Sebenarnya, metode seperti itu tergantung pada alat pengembangan / kompiler, tetapi akan selalu berhasil. Nilai kembali adalah perbedaan antara nilai ini dan nilai asli dari ruang stack, diterjemahkan ke dalam byte.
Atur ulang tugas
Panggilan API, dalam hal ini, mengembalikan tugas ke kondisi semula yang tidak digunakan. Fungsi API seperti itu berbeda dari fungsi reset API yang biasa untuk objek kernel lainnya, jika hanya karena itu adalah reset, dan tidak hanya mengatur tugas ke keadaan awal (untuk Nucleus SE itu bisa berupa
NUSE_READY atau entri
NUSE_Task_Initial_State [] (lihat Struktur Data di artikel selanjutnya)); tugas ditunda (
NUSE_PURE_SUSPEND ) dan harus dilanjutkan agar dijadwalkan kembali. Logika ini mirip dengan fungsi panggilan API yang sesuai di Nucleus RTOS.
Atur Ulang Tugas Panggil Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Reset_Task (tugas NU_TASK *, Argumen UNSIGNED, VOID * argv);Parameter:
tugas - pointer ke blok kontrol tugas;
argc - elemen data yang dapat digunakan untuk mentransfer informasi ke tugas;
argv adalah pointer yang dapat digunakan untuk meneruskan informasi ke tugas.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_TASK - penunjuk tidak valid untuk tugas;
NU_NOT_TERMINATED - tugas yang diuraikan tidak dalam status penangguhan lengkap (dihentikan) atau selesai (selesai); hanya tugas dalam keadaan jeda atau selesai yang dapat direset.
Panggilan reset tugas di Nucleus SEPanggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
STATUS NUSE_Task_Reset (tugas NUSE_TASK);Parameter:
tugas - indeks (ID) dari tugas yang akan diatur ulang.
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_TASK - indeks tugas tidak valid.
Terapkan Reset Tugas di Nucleus SETujuan utama fungsi API
NUSE_Task_Reset () setelah memeriksa parameter adalah untuk menginisialisasi ulang semua struktur data tugas:

Jika tugas diblokir ketika API dipanggil untuk menunggu akses ke objek kernel, hal pertama yang harus dilakukan adalah mengatur penghitung tugas yang diblokir terkait dengan objek. Ini dilakukan oleh pernyataan switch.
Kemudian, struktur data tugas diinisialisasi (pada dasarnya, dengan nol, kecuali untuk blok konteksnya) dengan memanggil fungsi inisialisasi
NUSE_Init_Task () . Implementasinya akan dibahas lebih rinci dalam artikel selanjutnya yang menjelaskan inisialisasi sistem. Terakhir, status tugas diatur ke
NUSE_PURE_SUSPEND .
Mendapatkan informasi tugas
Panggilan layanan ini memberikan informasi sebagian tentang tugas tersebut. Implementasi Nucleus SE berbeda dari Nucleus PLUS, di mana lebih sedikit informasi yang dikembalikan, karena penamaan objek, menggantikan tugas prioritas yang lebih rendah dan slice waktu tidak didukung, dan prioritas tidak dikembalikan, karena informasi yang berlebihan.
Panggil informasi tugas di Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Task_Information (NU_TASK * tugas, CHAR * nama, DATA_ELEMENT * task_status, UNSIGNED * dijadwalkan_count, OPSI * prioritas, OPSI * preempt, UNSIGNED * time_slice, VOID ** stack_base, UNSIGNED * stack_size * UNSIGNED;Parameter:
tugas - penunjuk ke tugas yang informasinya diminta;
name - pointer ke string 8 karakter untuk nama tugas; termasuk area untuk karakter nol;
task_status - penunjuk ke variabel yang menerima nilai status tugas saat ini;
dijadwalkan_count - penunjuk ke variabel yang menerima nilai penghitung, berapa kali tugas telah ditambahkan ke penjadwal;
priority - penunjuk ke variabel untuk mendapatkan prioritas tugas;
preempt - pointer ke variabel untuk opsi crowding out tugas prioritas yang lebih rendah;
NU_PREEMPT menunjukkan bahwa tugas tersebut dapat
dihadang , dan
NU_NO_PREEMPT menunjukkan bahwa tugas tersebut tidak dapat
dihabiskan ;
time_slice - pointer ke variabel untuk mendapatkan nilai dari kuantum waktu tugas; nilai 0 menunjukkan bahwa kuantisasi waktu tidak dimungkinkan untuk tugas ini;
stack_base - penunjuk ke variabel untuk mendapatkan alamat dari tumpukan tugas;
stack_size - penunjuk ke variabel untuk mendapatkan ukuran dari tumpukan tugas;
minimum_stack - pointer ke variabel untuk mendapatkan jumlah minimum byte yang tersisa di stack.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_TASK - penunjuk yang tidak valid untuk tugas tersebut.
Memanggil informasi tugas di Nucleus SEPanggilan ini mendukung fungsionalitas inti dari API Nucleus PLUS.
Prototipe panggilan layanan:
STATUS NUSE_Task_Information (tugas NUSE_TASK, U8 * task_status, U16 * dijadwalkan_count, ADDR * stack_base, U16 * stack_size);Parameter:
tugas - indeks tugas tentang informasi mana yang diminta;
task_status - pointer ke variabel
U8 yang menerima nilai status tugas saat ini (jika status tunggu tugas tidak tersedia, tidak ada yang dikembalikan);
dijadwalkan_count - penunjuk ke variabel
U16 , yang menerima nilai penghitung dari jumlah tugas yang ditambahkan ke penjadwal (jika penghitung tugas terjadwal dinonaktifkan, maka tidak ada yang dikembalikan);
stack_base - pointer ke variabel
ADDR yang menerima alamat dari tumpukan tugas (jika penjadwal RTC digunakan, tidak ada yang dikembalikan);
stack_size adalah pointer ke variabel
U16 yang mendapatkan ukuran dari tumpukan tugas (jika penjadwal RTC digunakan, tidak ada yang dikembalikan).
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_TASK - indeks tugas tidak valid;
NUSE_INVALID_POINTER - parameter pointer (satu atau lebih) salah.
Menerapkan pengambilan informasi tugas di Nucleus SEMenerapkan panggilan API ini cukup sederhana:

Fungsi mengembalikan status tugas, dengan mempertimbangkan berbagai opsi konfigurasi.
Mendapatkan jumlah tugas
Panggilan layanan ini mengembalikan informasi tentang jumlah tugas yang dikonfigurasi dalam aplikasi. Sementara dalam Nucleus RTOS angka ini dapat berubah, dan nilai kembali akan mewakili jumlah tugas saat ini, di Nucleus SE nilai kembali ditetapkan selama perakitan dan tidak berubah lagi.
Tantangan mendapatkan jumlah tugas di Nucleus RTOSPrototipe panggilan layanan:
NU_Established_Tasks (VOID) UNSIGNED;Parameter:
Tidak ada
Nilai pengembalian:
Jumlah tugas yang diinstal (dibuat dan tidak dihapus) dalam aplikasi.
Tantangan mendapatkan jumlah tugas di Nucleus SEPanggilan API ini mendukung fungsionalitas inti dari API Nucleus PLUS.
Prototipe panggilan layanan:
U8 NUSE_Task_Count (batal);Parameter:
Tidak ada
Nilai pengembalian:
Jumlah tugas yang dikonfigurasi dalam aplikasi.
ImplementasiImplementasi panggilan API ini cukup sederhana: nilai arahan
#define NUSE_TASK_NUMBER dikembalikan .
Artikel berikut akan membahas struktur data di Nucleus SE terkait dengan tugas dan beberapa panggilan API standar yang tidak didukung oleh Nucleus SE.
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.
Tentang terjemahan: seri artikel ini tampak menarik karena, meskipun ada pendekatan yang sudah ketinggalan zaman di beberapa tempat, penulis memperkenalkan pembaca yang kurang terlatih dengan fitur-fitur dari OS real-time. Saya sendiri termasuk dalam tim pembuat
RTOS Rusia , yang
ingin kami
bebaskan , dan saya harap siklus ini akan bermanfaat bagi pengembang pemula.