Sebelumnya kita sudah membahas mengenai vector table. Vector table menyimpan informasi interrupt berupa priority, alamat interrupt, dan sebagainya.
Pada tutorial kali ini kita akan mendalami salah satu informasi mengenai interrupt, yaitu priority.
Jadi, Apa itu Priority?
Secara definisi, Priority artinya urgensi. Ini mengindikasikan bahwa interrupt tersusun secara berurutan berdasarkan level prioritas mereka.
Priority Value
Seperti contoh diatas, priority value menentukan interrupt mana yang harus didahulukan.
Beberapa exception/interrupt memiliki nilai priority yang sudah fixed, seperti Reset, NMI, dan HardFault, tapi sebagian besar interrupt memiliki nilai priority yang bisa di ubah (Configurable).
Secara default, jika prioritas dari exception tidak ditentukan di awal (melalui kode) maka semua exception yang prioritasnya bersifat configurable akan memiliki nomer prioritas 0.
Ketika mengkonfigurasi priority pada interrupt, maka nomer priority tidak boleh kurang dari 0, sehingga hanya dimungkinkan nomer prioritas dalam rentang 0 - 255
Berapa jumlah level priority yang bisa digunakan?
Tergantung dari produsen mikrokontroller, Processor ARM memiliki sejumlah 2^8 level priority yang bisa digunakan. Dalam mikrokontroller STM32 terdapat 2^4 level priority yang bisa digunakan.
Saat beberapa interrupt terjadi secara bersamaan
Dalam beberapa kasus, interrupt bisa terjadi secara bersamaan, bagaimana cara menentukan mana dulu yang akan di proses?
1. Pre-empt/Priority Value
Seperti yang sudah dijelaskan di atas, pertama tama NVIC akan men-check priority value dari masing-masing interrupt yang masuk, Interupt yang memiliki priority value terkecil akan segera diproses.
2. Sub Priority
Jika masing-masing interrupt memiliki priority value yang sama maka sub priority value akan menjadi penentu kedua. Prinsipnya sama, Interrupt dengan nilai sub priority terkecil akan diproses terlebih dahulu.
3. IRQ Number
IRQ Number menjadi penentu terakhir apabila kedua masing-masing interrupt memiliki nilai priority dan sub-priority yang sama. Semakin kecil IRQ number semakin tinggi prioritasnya.
Priority Grouping
Priority grouping tersusun dari kombinasi pre-empt priority dan sub-priority yang terdapat pada interrupt priority register (IPR).
Jadi pada IPR, dibagi menjadi 2 bagian, Pre-empt dan sub-priority yang pembagian bit-nya di atur di tabel berikut.
Untuk mengatur priority grouping dilakukan melalui Register AIRCR (Application Interrupt and Reset Control Register).
Contoh : Priority Grouping = 0 (0b000)
Lihat table Priority Grouping Diatas
Pada Register AIRCR kita setting 0 pada bit field PRIOGROUP maka kita memiliki
Lebar bit pre-empt/priority = [7:1] - dari bit ke 1 sampai bit ke 7.
128 level prioritas yang bisa kita pilih.
Lebar bit Sub-priority [0] = Pada bit ke 0 kita bisa pilih level sub priority, 1 atau 0 (2 nilai sub priority.
Oke, kita sudah atur priority grouping dan kita akan dapatkan hasil seperti gambar diatas.
Meskipun lebar bit pre-empt priority mencakup bit 1-7 tapi yang hanya bisa dipakai hanya bit ke 4-7. Sekali lagi tergantung dari produsen mikrokontroller bagaimana mereka mengimplementasikan berapa bit yang bisa digunakan.
Comments