Semua mikroprosesor dan mikrokontroler modern mengandung semacam mekanisme interupsi. Mekanisme ini diperlukan untuk memberikan respons yang diperlukan oleh banyak aplikasi. Tentu saja, responsif dan prediktabilitas adalah tujuan utama saat menggunakan RTOS, tetapi pada saat yang sama mereka saling bertentangan. Menggunakan interupsi dapat mengganggu integritas OS waktu nyata. Masalah ini dan solusinya disebutkan dalam salah satu artikel sebelumnya (# 4 dan # 6). Pada artikel ini, kita akan melihat strategi penanganan interupsi yang digunakan dalam Nucleus SE. Dalam semua kasus, interupsi TIDAK dikendalikan oleh Nucleus SE: mereka diproses ketika terjadi sesuai dengan prioritas dan vektor dengan cara biasa. Waktu eksekusi mereka hanya "dicuri" dari waktu yang tersedia dalam kode aplikasi utama dan penjadwal. Jelas, itu berarti bahwa semua penangan interrupt harus sederhana, pendek, dan cepat.

Artikel sebelumnya dalam seri: Interupsi reguler dan terkontrol
Nucleus SE menawarkan dua cara untuk menangani interupsi: "asli" atau "reguler" (Asli), di mana interupsi tidak istimewa dan sampai batas tertentu memiliki interaksi terbatas dengan OS (setidaknya ketika menggunakan penjadwal prioritas), dan " Dikelola, di mana Anda dapat mengakses lebih banyak panggilan API dari interrupt handler.
Menggunakan makro I / O, pengendali interupsi Nucleus SE dapat digunakan dalam mode standar atau terkelola.
Interupsi staf
Interupsi Staf SE Inti adalah pengendali interupsi standar dan dapat dianggap "tidak dikelola." Mereka biasanya digunakan ketika gangguan dapat terjadi dengan frekuensi tinggi dan membutuhkan pemrosesan dengan penggunaan sumber daya komputasi yang rendah. Handler seperti itu kemungkinan besar ditulis dalam C, karena banyak kompiler tertanam modern mendukung pengembangan interrupt handler menggunakan kata kunci interrupt. Hanya informasi kontekstual yang dianggap perlu disimpan oleh penyusun. Ini mengarah pada batasan signifikan tentang apa yang dapat dilakukan oleh penangan interupsi standar, yang akan segera kita lihat.
Untuk membuat interrupt handler reguler di Nucleus SE, Anda hanya perlu menulis handler interrupt biasa, termasuk memanggil makro
NUSE_NISR_Enter () di awal dan memanggil
NUSE_NISR_Exit () di akhir. Makro ini didefinisikan dalam file
nuse_types. h dan atur variabel global
NUSE_Task_State ke
NUSE_NISR_CONTEXT .
Dipandu interupsi
Jika Anda membutuhkan lebih banyak fleksibilitas untuk operasi interrupt handler, interupsi terkelola Nucleus SE mungkin menjadi solusinya. Perbedaan utama dari interupsi standar adalah mempertahankan konteks. Alih-alih membiarkan kompiler menyimpan beberapa register di stack, interrupt yang terkontrol menyimpan seluruh konteks tugas (dalam blok konteksnya sendiri) di input. Kemudian konteks tugas saat ini dipulihkan dari blok konteks di output. Ini memberikan kemampuan untuk mengubah tugas saat ini dengan pekerjaan kode penangan interrupt, yang dimungkinkan saat menggunakan penjadwal prioritas. Deskripsi lengkap tentang pelestarian konteks dan restorasi di Nucleus SE disediakan dalam artikel sebelumnya (
# 10 ).
Jelas, pelestarian penuh konteks memerlukan peningkatan penggunaan sumber daya komputasi dibandingkan dengan penyimpanan beberapa register pada stack, yang terjadi selama gangguan standar. Harga ini harus dibayar untuk fleksibilitas tambahan, dan inilah yang menjadi alasan mengapa pilihan pendekatan penanganan interupsi disediakan.
Interupsi terkelola dibangun menggunakan
NUSE_MANAGED_ISR () makro yang dijelaskan dalam
nuse_types.h . Makro ini membuat fungsi yang berisi tindakan berikut:
- mempertahankan konteks tugas;
- Menetapkan NUSE_Task_State ke NUSE_MISR_CONTEXT ;
- kode fungsi penangan interupsi yang disediakan pengguna;
- mengembalikan NUSE_Task_State ke kondisi sebelumnya;
- mengembalikan konteks tugas.
Makro mengambil dua parameter: nama interrupt digunakan sebagai nama fungsi untuk handler yang dihasilkan, dan nama fungsi yang berisi logika pengguna untuk interrupt handler.
Panggilan API dari interrupt handler
Himpunan fungsi API yang dapat dipanggil dari penangan interupsi standar atau terkelola tergantung pada penjadwal yang digunakan. Secara umum, menggunakan penjadwal prioritas menyediakan banyak opsi untuk mengakses penjadwal melalui panggilan fungsi API, yang sulit ketika menggunakan penangan interupsi standar.
Panggilan API ke pengendali interupsi standar saat menggunakan penjadwal prioritasSaat menggunakan penjadwal prioritas, sejumlah kecil panggilan fungsi API dari penangan interupsi standar diperbolehkan. Batasan ini adalah hasil dari fleksibilitas Nucleus SE API: banyak panggilan dapat menyebabkan tugas menjadi siap dan penjadwal mungkin tidak dipanggil oleh pengendali interupsi standar (karena konteks tugas tidak disimpan). Mematikan kunci tugas memberikan fleksibilitas yang lebih besar.
Panggilan API berikut selalu diizinkan:
NUSE_Task_Current() NUSE_Task_Check_Stack() NUSE_Task_Information() NUSE_Task_Count() NUSE_Partition_Pool_Information() NUSE_Partition_Pool_Count() NUSE_Mailbox_Information() NUSE_Mailbox_Count() NUSE_Queue_Information() NUSE_Queue_Count() NUSE_Pipe_Information() NUSE_Pipe_Count() NUSE_Semaphore_Information() NUSE_Semaphore_Count() NUSE_Event_Group_Information() NUSE_Event_Group_Count() NUSE_Signals_Send() NUSE_Timer_Control() NUSE_Timer_Get_Remaining() NUSE_Timer_Reset() NUSE_Timer_Information() NUSE_Timer_Count() NUSE_Clock_Set() NUSE_Clock_Retrieve() NUSE_Release_Information()
Namun, hanya
NUSE_Signals_Send () yang berguna untuk mereka, karena memberikan cara yang mudah untuk menunjukkan kepada tugas bahwa beberapa tindakan diperlukan.
Jika kunci dinonaktifkan, yaitu, tugas tidak dapat dimasukkan ke status siap oleh banyak panggilan API, panggilan API tambahan menjadi tersedia:
NUSE_Partition_Allocate() NUSE_Partition_Deallocate() NUSE_Mailbox_Send() NUSE_Mailbox_Receive() NUSE_Mailbox_Reset() NUSE_Queue_Send() NUSE_Queue_Receive() NUSE_Queue_Jam() NUSE_Queue_Reset() NUSE_Pipe_Send() NUSE_Pipe_Receive() NUSE_Pipe_Jam() NUSE_Pipe_Reset() NUSE_Semaphore_Obtain() NUSE_Semaphore_Release() NUSE_Semaphore_Reset() NUSE_Event_Group_Set() NUSE_Event_Group_Retrieve()
Beberapa panggilan API selalu tidak dapat diakses oleh penangan interupsi standar, karena mereka pasti akan membutuhkan pekerjaan penjadwal:
NUSE_Task_Suspend() NUSE_Task_Resume() NUSE_Task_Sleep() NUSE_Task_Relinquish() NUSE_Task_Reset() NUSE_Signals_Receive()
Panggilan API ke pengendali interupsi yang dikelola atau pengendali interupsi standar saat menggunakan penjadwal apa pun selain penjadwal prioritasBanyak fungsi API lainnya dapat dipanggil dari interrupt handler ketika menggunakan penjadwal Run to Completion, Round Robin, atau Time Slice. Jika penjadwal prioritas digunakan, penangan interupsi yang dikelola memiliki serangkaian fungsi yang serupa. Ini karena panggilan diperbolehkan, yang dapat menyebabkan penjadwalan tugas lain. Fitur ini disediakan oleh kode
NUSE_Reschedule () , yang mendeteksi konteks panggilan dalam interrupt handler dan menekan perubahan konteks (memungkinkannya terjadi pada akhir interrupt handler). Analisis lengkap pekerjaan penjadwal diberikan di salah satu artikel sebelumnya (
# 9 ).
Persyaratan utama adalah bahwa panggilan API di dalam interrupt handler tidak boleh mengarah pada penangguhan tugas saat ini, misalnya, menunggu untuk membebaskan sumber daya.
Dengan kata lain, panggilan semacam itu harus dilakukan dengan
opsi jeda
NUSE_NO_SUSPEND .
Dengan mengingat hal ini, panggilan API berikut dapat digunakan:
NUSE_Task_Current() NUSE_Task_Check_Stack() NUSE_Task_Information() NUSE_Task_Count() NUSE_Task_Suspend() NUSE_Task_Resume() NUSE_Task_Reset() NUSE_Partition_Allocate() NUSE_Partition_Deallocate() NUSE_Partition_Pool_Information() NUSE_Partition_Pool_Count() NUSE_Mailbox_Send() NUSE_Mailbox_Receive() NUSE_Mailbox_Reset() NUSE_Mailbox_Information() NUSE_Mailbox_Count() NUSE_Queue_Send() NUSE_Queue_Receive() NUSE_Queue_Jam() NUSE_Queue_Reset() NUSE_Queue_Information() NUSE_Queue_Count() NUSE_Pipe_Send() NUSE_Pipe_Receive() NUSE_Pipe_Jam() NUSE_Pipe_Reset() NUSE_Pipe_Information() NUSE_Pipe_Count() NUSE_Semaphore_Obtain() NUSE_Semaphore_Release() NUSE_Semaphore_Reset() NUSE_Semaphore_Information() NUSE_Semaphore_Count() NUSE_Event_Group_Set() NUSE_Event_Group_Retrieve() NUSE_Event_Group_Information() NUSE_Event_Group_Count() NUSE_Signals_Send() NUSE_Timer_Control() NUSE_Timer_Get_Remaining() NUSE_Timer_Reset() NUSE_Timer_Information() NUSE_Timer_Count() NUSE_Clock_Set() NUSE_Clock_Retrieve() NUSE_Release_Information()
Beberapa panggilan selalu dilarang, karena mereka langsung berhubungan dengan tugas saat ini:
NUSE_Task_Relinquish() NUSE_Signals_Receive() NUSE_Task_Sleep()
Penangan Interupsi Jam Waktu Nyata
Penangan interupsi Real Time Clock (RTC) adalah satu-satunya penangan interupsi yang lengkap di Nucleus SE. Selain menyediakan semua fungsi yang diperlukan untuk manajemen waktu di Nucleus SE, ini juga berfungsi sebagai contoh penulisan interrupt handler yang dikelola.
Operasi Handler Interrupt RTC
Fungsi-fungsi yang disediakan oleh pengendali interupsi RTC tercantum dalam salah satu artikel sebelumnya, yang membahas topik luas waktu sistem dalam Nucleus SE (
# 27 ). Fungsionalitas yang dijelaskan adalah opsional tergantung pada konfigurasi aplikasi.
Berikut ini adalah kode penangan interupsi RTC lengkap. #if NUSE_TIMER_NUMBER != 0 { U8 timer; for (timer=0; timer<NUSE_TIMER_NUMBER; timer++) { if (NUSE_Timer_Status[timer]) { if (--NUSE_Timer_Value[timer] == 0) { NUSE_Timer_Expirations_Counter[timer]++; #if NUSE_TIMER_EXPIRATION_ROUTINE_SUPPORT || NUSE_INCLUDE_EVERYTHING if (NUSE_Timer_Expiration_Routine_Address[timer] != NULL) { ((PF1)NUSE_Timer_Expiration_Routine_Address[timer]) NUSE_Timer_Expiration_Routine_Parameter[timer]); } #endif /* reschedule? */ if (NUSE_Timer_Reschedule_Time[timer] != 0) { /* yes: set up time */ NUSE_Timer_Value[timer] = NUSE_Timer_Reschedule_Time[timer]; } else { /* no: disable */ NUSE_Timer_Status[timer] = FALSE; } } } } } #endif #if NUSE_SYSTEM_TIME_SUPPORT || NUSE_INCLUDE_EVERYTHING NUSE_Tick_Clock++; #endif #if NUSE_TASK_SLEEP || NUSE_INCLUDE_EVERYTHING { U8 task; for (task=0; task<NUSE_TASK_NUMBER; task++) { if (NUSE_Task_Timeout_Counter[task] != 0) { NUSE_Task_Timeout_Counter[task]--; if (NUSE_Task_Timeout_Counter[task] == 0) { NUSE_Wake_Task(task); } } } } #endif #if NUSE_SCHEDULER_TYPE == NUSE_TIME_SLICE_SCHEDULER if (--NUSE_Time_Slice_Ticks == 0) { NUSE_Reschedule(); } #endif
Selanjutnya, kita melihat empat bidang fungsi utama untuk pengendali interupsi RTC.
Pengatur waktuJika pengatur waktu aplikasi dikonfigurasikan, interrupt handler masuk ke loop untuk memproses setiap pengatur waktu dengan mengurangi penghitungnya dengan 1. Jika pengukur waktu penghitungan berakhir (mis. Penghitung mencapai 0), dua tindakan dimungkinkan:
- jika penangan penyelesaian waktu dikonfigurasikan dan timer memiliki penunjuk fungsi yang benar (non- NULL ) (dalam NUSE_Timer_Expiration_Routine_Address [] ), penangan dijalankan dengan mengambil parameter dari NUSE_Timer_Expiration_Routine_Parameter [] ;
- jika timer dikonfigurasikan untuk diinisialisasi setelah selesai (yaitu, NUSE_Timer_Reschedule_Time [] memiliki nilai non-nol), timer akan memuat ulang dengan nilai ini.
Pengatur waktu aplikasi dijelaskan secara rinci dalam artikel sebelumnya (# 28).
Jam SistemJika pengatur waktu sistem dikonfigurasi, nilai
NUSE_Tick_Cloc k meningkat dengan 1. Informasi lebih lanjut dapat ditemukan di artikel # 28.
Tangguhkan tugas (Tugas Tidur)Jika dukungan untuk tugas jeda diaktifkan (yaitu,
NUSE_Task_Sleep () panggilan API dikonfigurasikan), penghitung waktu habis dari setiap tugas (nilai dalam
NUSE_Task_Timeout_Counter [] ) dicentang, dan jika tidak sama dengan nol, berkurang sebesar 1. Jika tugasnya mencapai nol, tugas yang terkait akan dilanjutkan kembali. .
Penjadwalan Irisan WaktuJika penjadwal Time Slice digunakan, penghitung penjadwal (
NUSE_Time_Slice_Ticks ) dikurangi. Jika mencapai nol, penjadwal disebut. Panggilan ke
NUSE_Reschedule () bertanggung jawab untuk mengatur ulang penghitung.
Gangguan terkendali
Penting untuk menjelaskan mengapa pengendali interupsi RTC dapat dikontrol, karena dalam keadaan tertentu pengguna dapat memutuskan untuk menulis ulang sebagai interupsi standar untuk mengurangi penggunaan sumber daya komputasi. Misalnya, jika hanya satu fungsi waktu sistem yang digunakan (yaitu, tidak ada pengatur waktu aplikasi, tidak ada penangguhan tugas, dan tidak ada penjadwal Time Slice), gangguan teratur akan berfungsi. Gangguan terpandu diperlukan dalam kasus berikut:
- jika penghitung waktu digunakan dan penangan untuk penyelesaiannya telah dikonfigurasi, karena penangan ini dapat melakukan panggilan API (dari konteks interupsi), yang akan menyebabkan penjadwalan baru. Mereka memiliki batasan yang sama dengan panggilan API yang dibuat dari penangan interrupt (lihat sebelumnya dalam artikel ini);
- jika penjadwal prioritas digunakan, menyelesaikan penangguhan tugas mungkin memerlukan bangun tugas dengan prioritas lebih tinggi;
- jika penjadwal Time Slice digunakan, itu akan dipanggil dari pengendali interupsi RTC, oleh karena itu, diperlukan interupsi terkontrol.
Kompatibel dengan RTOS Inti
Karena implementasi interupsi Nucleus SE sangat berbeda dari Nucleus RTOS, Anda seharusnya tidak mengharapkan kompatibilitas dalam hal ini. Nucleus RTOS memiliki skema interupsi standar / level rendah / level tinggi, yang sedikit mirip dengan skema interupsi standar / terkontrol di Nucleus SE.
Penangan interupsi level rendah dan level tinggi
Penangan Interupsi Tingkat RendahLow-Level Interrupt Service Routin (LISR) dilakukan dengan cara yang sama seperti pengendali biasa, termasuk menggunakan tumpukan saat ini. Nucleus RTOS mempertahankan konteks sampai handler interrupt level rendah dipanggil, dan mengembalikan konteks setelah handler selesai. Oleh karena itu, penangan interupsi tingkat rendah dapat ditulis dalam C dan dapat memanggil penangan lain dalam C. Namun, hanya beberapa layanan RTOS Inti yang tersedia untuk penangan tingkat rendah. Jika penanganan interupsi membutuhkan layanan Nucleus RTOS tambahan, Anda perlu mengaktifkan pengendali interupsi tingkat tinggi. Nucleus RTOS mendukung penggunaan beberapa penangan interupsi tingkat rendah.
Handler Interrupt Tingkat TinggiRouting Layanan Interupsi Tingkat Tinggi (HISR) dibuat dan dihapus secara dinamis. Setiap prosesor tingkat tinggi memiliki ruang stack dan unit kontrolnya sendiri. Memori dialokasikan oleh aplikasi. Dan, tentu saja, penangan interupsi tingkat tinggi harus dibuat sebelum penangan interupsi tingkat rendah dapat mengaktifkannya.
Karena interrupt handler tingkat tinggi memiliki stack dan unit kontrol sendiri, ia dapat diblokir sementara jika mencoba mengakses struktur data RTOS Nucleus yang saat ini digunakan.
Ada tiga tingkat prioritas yang tersedia untuk penangan interupsi tingkat tinggi. Jika pawang tingkat yang lebih tinggi dengan prioritas yang lebih tinggi diaktifkan selama pekerjaan pawang dengan prioritas yang lebih rendah, pawang dengan prioritas yang lebih rendah akan dieksekusi ketika tugas selesai. Penangan interupsi tingkat tinggi dengan prioritas yang sama dijalankan sesuai urutan pengaktifannya. Semua penangan interupsi tingkat tinggi yang diaktifkan harus diselesaikan sebelum melanjutkan untuk menjadwalkan tugas dalam mode normal.
Utilitas API RTOS Nucleus Menyerukan Gangguan
Nucleus RTOS memiliki beberapa panggilan API untuk mendukung interupsi. Tak satu pun dari mereka diimplementasikan dalam Nucleus SE.
Untuk interupsi standar, panggilan API menyediakan fungsi-fungsi berikut:
- kontrol (aktivasi / deaktivasi) dari gangguan (lokal dan global);
- mengatur vektor interupsi.
Untuk gangguan tingkat rendah:
- mendaftarkan pengendali interupsi tingkat rendah di kernel.
Untuk gangguan tingkat tinggi:
- pembuatan / penghapusan gangguan tingkat tinggi;
- aktivasi interupsi tingkat tinggi;
- mendapatkan jumlah interupsi tingkat tinggi dalam aplikasi (saat ini);
- mendapatkan petunjuk untuk mengontrol unit-unit dari semua gangguan tingkat tinggi;
- mendapatkan petunjuk untuk mengontrol unit interupsi tingkat tinggi saat ini;
- Mendapatkan informasi interupsi tingkat tinggi.
Kontrol interupsi globalPanggilan ini mengaktifkan atau menonaktifkan interupsi terlepas dari tugasnya. Oleh karena itu, interupsi yang dinonaktifkan oleh panggilan ini akan tetap demikian hingga diaktifkan dengan menggunakan kembali panggilan ini.
Prototipe panggilan layanan:
INT NU_Control_Interrupts (INT new_level);
Parameter:
new_level - level interupsi baru untuk sistem. Itu selalu dapat mengambil nilai
NU_DISABLE_INTERRUPTS (menonaktifkan semua interupsi) dan
NU_ENABLE_INTERRUPTS (mengaktifkan semua interupsi). Nilai-nilai lain mungkin tersedia tergantung pada arsitekturnya.
Nilai pengembalian:
Panggilan layanan ini mengembalikan tingkat interupsi yang diaktifkan sebelumnya.
Kontrol interupsi lokalPanggilan layanan ini memungkinkan Anda untuk mengaktifkan atau menonaktifkan interupsi tergantung pada tugas. Panggilan ini mengubah register status ke nilai yang ditentukan. Register status akan dikembalikan ke nilai yang ditentukan oleh panggilan terakhir ke
NU_Control_Interrupts () saat konteks berikutnya diubah.
Prototipe panggilan layanan:
INT NU_Local_Control_Interrupts (INT new_level);
Parameter:
new_level - level interupsi baru untuk tugas saat ini. Itu selalu dapat mengambil nilai
NU_DISABLE_INTERRUPTS (menonaktifkan semua interupsi) dan
NU_ENABLE_INTERRUPTS (mengaktifkan semua interupsi). Nilai-nilai lain mungkin tersedia tergantung pada arsitekturnya.
Nilai pengembalian:
Panggilan layanan ini mengembalikan tingkat interupsi yang diaktifkan sebelumnya.
Mengatur vektor interupsiOverhead ini menggantikan vektor interupsi yang ditentukan oleh vektor yang dikendalikan oleh pengendali interupsi.
Prototipe panggilan layanan:
VOID *NU_Setup_Vector (INT vector, VOID *new);
Parameter:
vektor -
vektor interupsi di mana interupsi akan didaftarkan;
baru adalah interrupt handler yang ditulis untuk vektor.
Nilai pengembalian:
Panggilan utilitas ini mengembalikan pointer ke interrupt handler yang sebelumnya terdaftar untuk vektor interrupt.
Logging Interupsi Tingkat RendahOverhead ini memanggil fungsi interrupt handler level rendah dengan vektor interrupt. Konteks sistem secara otomatis disimpan sebelum pengendali interupsi tingkat rendah yang ditentukan dipanggil dan dipulihkan setelah penangan interupsi selesai.
Prototipe panggilan layanan:
STATUS NU_Register_LISR (INT vector, VOID (*lisr_entry) (INT), VOID (**old_lisr) (INT);
Parameter:
vektor -
vektor interupsi di mana interupsi akan didaftarkan;
lisr_entry - fungsi yang akan didaftarkan untuk vektor, nilai
NU_NULL akan menghapus vektor;
old_lisr adalah fungsi yang sebelumnya terdaftar untuk vektor yang ditentukan.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_VECTOR - vektor tidak valid;
NU_NOT_Rektor - saat ini vektor tidak terdaftar, karena de-registrasi ditentukan di l
isr_entry ;
NO_MORE_LISRS - Jumlah maksimum penangan interupsi tingkat rendah terdaftar telah tercapai.
Menciptakan pengendali interupsi tingkat tinggiPanggilan utilitas ini menciptakan pengendali interupsi tingkat tinggi.
Prototipe panggilan layanan:
STATUS NU_Create_HISR (NU_HISR *hisr, CHAR *name, VOID (*hisr_entry) (VOID), OPTION priority, VOID *stack_pointer, UNSIGNED stack_size);
Parameter:
hisr - pointer ke blok kontrol yang disediakan pengguna untuk pengendali interupsi tingkat tinggi;
name - pointer ke nama 7-karakter untuk pengendali interupsi tingkat tinggi dengan nol penghentian;
hisr_entry - titik masuk dari fungsi pengendali interupsi tingkat tinggi;
prioritas - ada tiga prioritas untuk penangan interupsi tingkat tinggi (0-2); prioritas 0 adalah yang tertinggi;
stack_pointer - penunjuk ke area tumpukan penangan interupsi tingkat tinggi;
stack_size - jumlah byte dalam stack dari interrupt handler tingkat tinggi.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_HISR - pointer nol ke unit kontrol penangan interupsi tingkat tinggi (
NULL ) atau unit kontrol sudah digunakan;
NU_INVALID_ENTRY - pointer nol ke titik masuknya interrupt handler tingkat tinggi (
NULL );
NU_INVALID_PRIORITY - prioritas yang salah untuk penangan interupsi tingkat tinggi;
NU_INVALID_MEMORY - penunjuk tumpukan tidak valid;
NU_INVALID_SIZE - ukuran tumpukan terlalu kecil.
Menghapus pawang interrupt tingkat tinggiPanggilan utilitas ini menghapus penangan interupsi tingkat tinggi yang sebelumnya dibuat.
Prototipe panggilan layanan:
STATUS NU_Delete_HISR (NU_HISR *hisr);
Parameter:
hisr adalah sebuah penunjuk ke blok kontrol penangan interupsi tingkat tinggi yang disediakan oleh pengguna.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_HISR - Pointer
tidak valid ke pengendali interupsi tingkat tinggi.
Mengaktifkan penangan interupsi tingkat tinggiPanggilan utilitas ini mengaktifkan penangan interupsi tingkat tinggi. Jika penangan interupsi tingkat tinggi yang ditentukan saat ini sedang dieksekusi, permintaan aktivasi tidak dieksekusi sampai penangan berhenti bekerja. Penangan interupsi tingkat tinggi dijalankan sekali untuk setiap permintaan aktivasi.
Prototipe panggilan layanan:
STATUS NU_Activate_HISR (NU_HISR *hisr);
Parameter:
hisr adalah pointer ke blok kontrol dari penangan interupsi tingkat tinggi.
Nilai pengembalian:
NU_SUCCESS - panggilan berhasil diselesaikan;
NU_INVALID_HISR - penunjuk yang tidak valid ke unit kontrol penangan interupsi tingkat tinggi.
Mendapatkan jumlah penangan interupsi tingkat tinggi dalam suatu sistemPanggilan utilitas ini mengembalikan jumlah penangan interupsi tingkat tinggi yang diinstal. Semua penangan interupsi tingkat tinggi yang dibuat dianggap diinstal. Penangan interupsi tingkat tinggi jarak jauh tidak dianggap diinstal.
Prototipe panggilan layanan:
UNSIGNED NU_Established_HISRs(VOID);
Parameter:
Tidak ada.
Nilai pengembalian:
Panggilan utilitas ini mengembalikan jumlah penangan interupsi tingkat tinggi yang diinstal dalam sistem.
Mendapatkan pointer untuk mengontrol blok penangan interupsi tingkat tinggiPanggilan layanan ini membentuk daftar penunjuk berurutan untuk semua penangan interupsi tingkat tinggi yang terpasang dalam sistem.
Prototipe panggilan layanan:
UNSIGNED NU_HISR_Pointers(NU_HISR **pointer_list, UNSIGNED maximum_pointers);
Parameter:
pointer_list - pointer ke array pointer
NU_HISR ; array ini akan diisi dengan pointer ke penangan interupsi tingkat tinggi yang diinstal dalam sistem;
maksimum_pointers - jumlah maksimum pointer
NU_HISR yang dapat ditempatkan dalam array; biasanya sama dengan ukuran array
pointer_list .
Nilai pengembalian:
Panggilan utilitas ini mengembalikan jumlah penangan interupsi tingkat tinggi yang aktif dalam sistem.
Mendapatkan pointer ke penangan interupsi tingkat tinggi saat iniPanggilan utilitas ini mengembalikan pointer ke penangan interupsi tingkat tinggi yang sedang dijalankan.
Prototipe panggilan layanan:
NU_HISR *NU_Current_HISR_Pointer(VOID);
Parameter:
Tidak ada.
Nilai pengembalian:
Panggilan layanan ini mengembalikan pointer ke unit kontrol penangan interupsi tingkat tinggi yang sedang dijalankan. Jika penangan interupsi tingkat tinggi memanggil fungsi ini,
NU_NULL dikembalikan.
Mendapatkan informasi tentang pengendali interupsi tingkat tinggiPanggilan utilitas ini mengembalikan berbagai informasi tentang penangan interupsi tingkat tinggi yang ditentukan.
Prototipe panggilan layanan:
STATUS NU_HISR_Information(NU_HISR *hisr, char *name, UNSIGNED *scheduled_count, DATA_ELEMENT *priority, VOID **stack_base, UNSIGNED *stack_size, UNSIGNED *minimum_stack);
Parameter:
hisr - pointer ke pengendali interrupt tingkat tinggi;
name - pointer ke wilayah 8 karakter untuk nama interrupt level handler tinggi, termasuk nol terminating;
dijadwalkan_count - penunjuk ke variabel untuk jumlah total kali penangan interupsi tingkat tinggi ini dijadwalkan;
priority - pointer ke variabel untuk menyimpan prioritas pengendali interupsi tingkat tinggi;
stack_base - pointer ke pointer untuk menyimpan pointer asli ke stack; ini adalah pointer yang sama yang dilewatkan saat membuat pengendali interupsi tingkat tinggi;
stack_size - pointer ke variabel untuk menyimpan ukuran tumpukan total dari penangan interupsi tingkat tinggi;
minimum_stack - pointer ke variabel untuk menyimpan jumlah minimum ruang stack yang tersedia yang terdeteksi selama eksekusi penangan interupsi tingkat tinggi.Nilai kembali:NU_SUCCESS - panggilan berhasil diselesaikan;NU_INVALID_HISR - Pointer tidak valid ke pengendali interupsi tingkat tinggi.Panggilan API dari penangan interupsi
Panggilan API dari penangan interupsi tingkat rendah Penangan interupsi tingkat rendahhanya dapat menggunakan fitur Nucleus RTOS berikut: NU_Activate_HISR() NU_Local_Control_Interrupts() NU_Current_HISR_Pointer() NU_Current_Task_Pointer() NU_Retrieve_Clock()
Panggilan layanan API dari penangan interupsi tingkattinggi Penangan interupsi tingkat tinggi memiliki akses ke sebagian besar fungsi Nucleus RTOS, kecuali untuk fungsi penghentian sendiri, karena penangan interupsi tingkat tinggi tidak dapat menunda fungsi Nucleus RTOS, parameternya harus selalu NU_NO_SUSPEND .Artikel selanjutnya dalam seri ini akan membahas prosedur inisialisasi dan startup Nucleus SE.Tentang penulis:Colin Walls telah bekerja di industri elektronik selama lebih dari tiga puluh tahun, menghabiskan sebagian besar waktunya untuk firmware. Dia sekarang 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.