Seluruh kebenaran tentang RTOS. Artikel # 11. Tugas: konfigurasi dan pengantar API



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 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.

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 FungsionalRTOS intiNucleus SE
Jeda tugasNU_Suspend_Task ()NUSE_Task_Suspend ()
Melanjutkan tugasNU_Resume_Task ()NUSE_Task_Resume ()
Jeda tugas untuk spesifik
periode
NU_Sleep ()NUSE_Task_Sleep ()
Pelepasan Kontrol CPUNU_Relinquish ()NUSE_Task_Relinquish ()
Mendapatkan ID dari tugas saat iniNU_Current_Task_Pointer ()NUSE_Task_Current ()
Memeriksa Ukuran Stack Yang TersediaNU_Check_Stack ()NUSE_Task_Check_Stack ()
Kembalikan tugas ke yang tidak digunakan
status (reset)
NU_Reset_Task ()NUSE_Task_Reset ()
Memberikan informasi tentang tugas tertentuNU_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 aplikasiNU_Delete_Task ()Tidak diterapkan.
Kembalikan pointer ke semua tugas
dalam aplikasi
NU_Task_Pointers ()Tidak diterapkan.
Ubah Algoritma EkstrusiNU_Change_Preemption ()Tidak diterapkan.
Ubah prioritas tugasNU_Ubah_Prioritas ()Tidak diterapkan.
Ubah kuantum waktu tugasNU_Ubah_Time_Slice ()Tidak diterapkan.
Penyelesaian tugasNU_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 RTOS
Prototipe 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 SE
Panggilan 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 SE
Fungsi 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 RTOS
Prototipe 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 SE
Panggilan 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 SE
Fungsi 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 tertentu
Prototipe 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 SE
Panggilan 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 SE
Fungsi 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 RTOS
Panggilan 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 SE
Panggilan 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 SE
Fungsi 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.

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


All Articles