
Konsep masalah diperkenalkan pada artikel sebelumnya. Pada dasarnya, tugas hanyalah seperangkat nilai yang dapat dimuat ke dalam register prosesor (untuk tugas yang sedang dilakukan) atau dapat disimpan dalam keadaan siap untuk pengalihan kontekstual ke tugas di masa mendatang. Paling sering, tugas memiliki tumpukan sendiri.
Tentu saja, ketika menggunakan penjadwal Run to Completion (RTC), pengalihan konteks tidak digunakan, dan tugas tersebut dapat dianggap hanya nilai dari penghitung program (titik entri kode).
Definisi tugas tidak termasuk kode itu sendiri. Tugas harus mengeksekusi kode, tetapi bukan miliknya. Tugas mungkin memiliki fungsi umum. Selain itu, semua kode untuk beberapa tugas dapat dibagikan. Kode umum hampir selalu harus ditulis sesuai dengan persyaratan reentrant. Kebanyakan kompiler dapat dengan mudah mengatasi kode ini, tetapi perhatian harus diberikan pada fungsi pustaka, karena mungkin tidak cocok untuk aplikasi multitasking.
Definisi semacam itu menentukan aturan tertentu yang harus diikuti ketika mengembangkan struktur data tugas dan fungsi API yang dijelaskan dalam artikel ini. Saya akan meninjau konfigurasi tugas di Nucleus SE dan memulai tinjauan rinci panggilan layanan (panggilan API) yang berlaku untuk tugas di Nucleus SE dan Nucleus RTOS.
Artikel sebelumnya dalam seri:
Artikel # 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.
Konfigurasi tugas
Jumlah tugas
Di Nucleus SE, konfigurasi tugas terutama didorong oleh
#define directives di
nuse_config.h . Parameter kunci
NUSE_TASK_NUMBER menentukan jumlah tugas yang dapat dikonfigurasi dalam aplikasi. Nilai default adalah 1 (mis., Satu tugas selama eksekusi), dan nilai maksimum parameter adalah 16. Nilai yang salah akan menyebabkan kesalahan kompilasi, yang akan dihasilkan dengan memeriksa
nuse_config_chech.h (ini termasuk dalam
nuse_config.c , yang berarti dikompilasi dengan modul ini), arahan
#error akan
aktif . Parameter ini digunakan untuk menentukan struktur data, ukurannya tergantung pada nilainya.
Dalam Nucleus SE, kecuali saat menggunakan penjadwal RTC, penting bahwa setidaknya satu tugas selalu siap untuk dieksekusi. Saat menggunakan penjadwal Prioritas, Anda perlu memastikan bahwa tugas dengan prioritas terendah tidak akan pernah dalam status ditangguhkan, tugas semacam itu harus dianggap sebagai "tugas latar belakang".
Tidak seperti beberapa core real-time lainnya, Nucleus SE tidak menggunakan "tugas sistem", yang berarti bahwa semua 16 tugas tersedia untuk kode aplikasi pengguna atau Middleware.
Parameter API
Setiap fungsi API (panggilan utilitas) di Nucleus SE diaktifkan oleh arahan
#define di
nuse_config.h . Untuk tugas, parameter ini adalah:
- NUSE_TASK_SUSPEND
- NUSE_TASK_RESUME
- NUSE_TASK_SLEEP
- NUSE_TASK_RELINQUISH
- NUSE_TASK_CURRENT
- NUSE_TASK_CHECK_STACK
- NUSE_TASK_RESET
- NUSE_TASK_INFORMATION
- NUSE_TASK_COUNT
Secara default, semua parameter di atas diatur ke
FALSE , sehingga menonaktifkan setiap panggilan layanan dan mencegah dimasukkannya kode apa pun yang mengimplementasikannya. Untuk mengonfigurasi tugas untuk aplikasi, Anda harus memilih panggilan API yang diperlukan dan mengatur karakter yang sesuai ke
TRUE .
Berikut ini adalah
cuplikan dari file
nuse_config.h default.

Jika kode Anda menggunakan panggilan API yang belum diaktifkan, kesalahan akan muncul selama menautkan karena kode implementasi tidak termasuk dalam aplikasi.
Parameter Fungsional
Nucleus SE dapat menambahkan beberapa fungsi tugas. Dan lagi, parameter yang diperlukan ada di file
nuse_config.h :
NUSE_SUSPEND_ENABLE memungkinkan
Anda untuk menjeda tugas. Jika opsi ini tidak dipilih, semua tugas selalu menunggu penjadwalan. Aktivasi parameter ini diperlukan saat menggunakan Penjadwal prioritas.
NUSE_BLOCKING_ENABLE memungkinkan
Anda untuk menangguhkan tugas ke beberapa fungsi panggilan API. Jika opsi ini diaktifkan,
NUSE_SUSPEND_ENABLE juga harus diaktifkan.
NUSE_INITIAL_TASK_STATE_SUPPORT memungkinkan
Anda untuk mengatur status awal tugas. Jika opsi ini tidak dipilih, semua tugas akan ditambahkan ke penjadwal segera setelah dibuat.
Panggilan tugas utilitas
Nucleus RTOS mendukung 16 panggilan layanan (API) untuk bekerja dengan tugas-tugas yang menyediakan fungsionalitas berikut:
Deskripsi Fungsional | RTOS inti | Nucleus SE |
---|
Jeda tugas | NU_Suspend_Task () | NUSE_Task_Suspend () |
Melanjutkan tugas | NU_Resume_Task () | NUSE_Task_Resume () |
Jeda tugas untuk spesifik periode | NU_Sleep () | NUSE_Task_Sleep () |
Pelepasan Kontrol CPU | NU_Relinquish () | NUSE_Task_Relinquish () |
Mendapatkan ID dari tugas saat ini | NU_Current_Task_Pointer () | NUSE_Task_Current () |
Memeriksa Ukuran Stack Yang Tersedia | NU_Check_Stack () | NUSE_Task_Check_Stack () |
Kembalikan tugas ke yang tidak digunakan status (reset) | NU_Reset_Task () | NUSE_Task_Reset () |
Memberikan informasi tentang tugas tertentu | NU_Task_Information () | NUSE_Task_Information () |
Mendapatkan penghitung yang dikonfigurasi tugas (saat ini) dalam aplikasi | NU_Established_Tasks () | NUSE_Task_Count () |
Menambahkan tugas baru ke aplikasi (pembuatan) | NU_Create_Task () | Tidak diterapkan. |
Menghapus tugas dari aplikasi | NU_Delete_Task () | Tidak diterapkan. |
Kembalikan pointer ke semua tugas dalam aplikasi | NU_Task_Pointers () | Tidak diterapkan. |
Ubah Algoritma Ekstrusi | NU_Change_Preemption () | Tidak diterapkan. |
Ubah prioritas tugas | NU_Ubah_Prioritas () | Tidak diterapkan. |
Ubah kuantum waktu tugas | NU_Ubah_Time_Slice () | Tidak diterapkan. |
Penyelesaian tugas | NU_Terminate_Task () | Tidak diterapkan. |
Implementasi dari masing-masing panggilan layanan di atas dibahas secara rinci di bawah ini, serta dalam artikel berikut tentang RTOS.
Layanan manajemen tugas
Operasi dasar dengan tugas: menjeda tugas untuk waktu yang tidak terbatas, melanjutkan, menjeda tugas untuk waktu tertentu, membebaskan prosesor. Nucleus RTOS dan Nucleus SE menyediakan empat panggilan API dasar untuk melakukan operasi ini, yang akan saya uraikan di bawah ini.
Jeda tugas
Nucleus PLUS menyediakan panggilan API sederhana yang memungkinkan Anda untuk menjeda tugas tertentu tanpa batas. Nucleus SE memiliki panggilan kantor dengan fungsi serupa.
Tangguhkan tugas di Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Suspend_Task (tugas NU_TASK *);Parameter:
task - pointer ke unit kontrol dari tugas yang dihentikan (yang mungkin saat ini, dan ID-nya dapat diperoleh dengan menggunakan
NU_Current_Task_Pointer () , lebih banyak di artikel berikutnya).
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_TASK - penunjuk tidak valid untuk tugas;
NU_INVALID_SUSPEND - Tugas yang ditentukan memiliki status
NU_FINISHED atau
NU_TERMINATED .
Tantang tugas jeda di Nucleus SEPanggilan API ini mendukung fungsionalitas inti dari API Nucleus PLUS.
Prototipe panggilan layanan:
STATUS NUSE_Task_Suspend (tugas NUSE_TASK);Parameter:
tugas - indeks (ID) dari tugas yang dihentikan (yang dapat saat ini, dan ID-nya dapat diperoleh dengan menggunakan
NUSE_Task_Current () - lebih banyak di artikel berikutnya).
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_TASK - indeks tugas tidak valid.
Menerapkan penangguhan tugas di Nucleus SEFungsi utama dari fungsi API cukup sederhana:

Bahkan, dalam implementasi ini, fungsi scheduler
NUSE_Suspend_Task () dipanggil dengan parameter “unconditional stop” (
NUSE_PURE_SUSPEND ). Fungsi ini memanggil penjadwal jika tugas yang dijeda berlangsung.
Melanjutkan tugas
Nucleus RTOS menyediakan panggilan API sederhana yang memungkinkan Anda untuk melanjutkan tugas yang sebelumnya dijeda tanpa batas waktu. Nucleus SE memiliki panggilan kantor dengan fungsi serupa.
Tantangan melanjutkan tugas di Nucleus RTOSPrototipe panggilan layanan:
STATUS NU_Resume_Task (tugas NU_TASK *);Parameter:
task - pointer ke unit kontrol dari tugas yang diperbarui.
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_TASK - penunjuk tidak valid untuk tugas;
NUSE_INVALID_RESUME - Tugas belum ditangguhkan tanpa syarat.
Tantangan Melanjutkan Tugas di Nucleus SEPanggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
STATUS NUSE_Task_Resume (tugas NUSE_TASK);Parameter:
tugas - indeks (ID) dari tugas yang diperbarui.
Nilai pengembalian:
NUSE_SUCCESS - panggilan berhasil diselesaikan;
NUSE_INVALID_TASK - indeks tugas tidak valid;
NUSE_INVALID_RESUME - Tugas belum ditangguhkan tanpa syarat.
Menerapkan Tugas Lanjutkan di Nucleus SEFungsi utama dari fungsi API cukup sederhana:

Bahkan, fungsi scheduler
NUSE_Wake_Task () dipanggil dalam implementasi ini. Fungsi ini memanggil penjadwal jika Penjadwal prioritas digunakan, dan tugas yang diperbarui memiliki prioritas lebih tinggi daripada tugas saat ini.
Menjeda tugas untuk periode waktu tertentu
Nucleus RTOS menyediakan panggilan API sederhana untuk menjeda tugas saat ini untuk periode waktu tertentu. Nucleus SE memiliki panggilan kantor dengan fungsi serupa.
Sebut tugas yang ditangguhkan untuk periode waktu tertentuPrototipe panggilan layanan:
VOID NU_Sleep (kutu tidak ditandai);Parameter:
ticks - periode waktu di mana tugas harus ditangguhkan (dalam waktu
aktual ).
Nilai pengembalian:
Tidak.
Menantang jeda tugas untuk periode waktu tertentu Nucleus SEPanggilan API ini mendukung fungsionalitas inti API Nucleus RTOS.
Prototipe panggilan layanan:
membatalkan NUSE_Task_Sleep (U16 ticks);Parameter:
ticks - periode waktu di mana tugas harus ditangguhkan (dalam waktu
aktual ).
Nilai pengembalian:
Tidak.
Menerapkan penangguhan tugas untuk periode waktu tertentu di Nucleus SEFungsi utama dari fungsi API cukup sederhana:

Kode ini memuat nilai penundaan ke dalam parameter tugas saat ini di
NUSE_Task_Timeout_Counter [] . Setelah itu, tugas dijeda menggunakan
NUSE_Suspend_Task () dengan periode waktu penangguhan (
NUSE_SLEEP_SUSPEND ).
Nilai batas waktu digunakan oleh penangan interupsi jam waktu nyata. Kode ditunjukkan di bawah ini dan akan dibahas lebih rinci dalam artikel mendatang.

Rilis CPU
Nucleus PLUS menyediakan panggilan API sederhana untuk memungkinkan transfer kontrol prosesor ke salah satu tugas siap-jalankan dengan prioritas yang sama berdasarkan pada algoritma Round Robin. Nucleus SE memiliki panggilan kantor dengan fungsi yang sangat mirip. Namun, itu tidak dapat digunakan dengan Penjadwal Prioritas, karena beberapa tugas dengan prioritas yang sama tidak didukung. Mencoba menggunakan panggilan API ini dengan Penjadwal prioritas akan menghasilkan kesalahan. Panggilan utilitas berfungsi dengan penjadwal Round Robin dan Time Slice, dengan penjadwal Run To Completion, panggilan API ini tidak efisien.
Panggilan rilis prosesor inti RTOSPanggilan API ini mendukung fungsionalitas inti dari API Nucleus PLUS.
Prototipe panggilan layanan:
VOID NU_Relinquish (VOID);Parameter:
Tidak ada.
Nilai pengembalian:
Tidak.
Panggilan rilis prosesor Nucleus SEPanggilan API ini mendukung fungsionalitas inti dari API Nucleus PLUS.
Prototipe panggilan layanan:
membatalkan NUSE_Task_Relinquish (batal);Parameter:
Tidak ada.
Nilai pengembalian:
Tidak.
Implementasi rilis prosesor Nucleus SEFungsi utama dari fungsi API:

Pada dasarnya, implementasi ini memanggil fungsi
penjadwal NUSE_Reschedule () . Fungsi ini hanya memberitahu scheduler untuk menyelesaikan tugas selanjutnya.
Dua artikel berikutnya akan terus meninjau panggilan utilitas RTOS terkait tugas menggunakan contoh Nucleus RTOS dan 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 penerjemahan: seri artikel ini tampak menarik karena, meskipun ada pendekatan yang sudah ketinggalan zaman di beberapa tempat, penulis dalam bahasa yang sangat dimengerti memperkenalkan pembaca yang kurang terlatih ke 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.