Fungsi interupsi perangkat lunak vs.

10

Setelah sekitar 3 tahun bekerja dengan MCU, saya masih tidak tahu apa gunanya interupsi Perangkat Lunak? Saya telah melakukan beberapa pekerjaan dengan STM32 dan saya tidak pernah menggunakan interupsi perangkat lunak. Memang ini pertanyaan besar bagi saya:

Mengapa ketika kita dapat menggunakan fungsi sederhana untuk melakukan tugas, haruskah kita menggunakan interupsi perangkat lunak? Apa perbedaan antara interupsi perangkat lunak dan suatu fungsi?

Setiap kali Anda suka, Anda dapat memanggil fungsi (yang telah Anda tulis untuk pekerjaan Anda). Seharusnya ada beberapa manfaat menggunakan interupsi perangkat lunak daripada fungsi sederhana. Saya tidak yakin tetapi saya pikir ada manfaat untuk gangguan perangkat lunak: Anda dapat menetapkan prioritas untuk gangguan perangkat lunak, maka Anda dapat memberikan prioritas yang lebih tinggi untuk gangguan perangkat lunak untuk menghindari gangguan perangkat keras yang merusak tugas Anda.

Roh
sumber
1
Saya pikir tujuan utama untuk menggunakan interupsi adalah bahwa Anda dapat terus melakukan tugas-tugas penting lainnya sementara itu sedang menunggu sesuatu yang lain terjadi, dan ketika waktunya tidak selalu konstan. Juga saya pikir ini sedikit lebih cepat daripada pemungutan suara dalam banyak kasus.
MrPhooky
1
@MrPhooky Itu Hardware mengganggu Anda yang sedang Anda bicarakan. OP berbicara tentang gangguan Perangkat Lunak.
brhans

Jawaban:

19

Perbedaan utama antara fungsi dan interupsi perangkat lunak adalah apa yang dikenal sebagai konteks .

  • Sebuah fungsi berjalan dalam konteks program utama Anda.
  • Interrupt berjalan dalam konteks interrupt handler.

Pada sistem yang sederhana ini mungkin tidak ada perbedaan nyata, dan interupsi perangkat lunak hanya dapat digunakan sebagai cara mudah untuk menyediakan rutinitas pustaka yang dikodekan dalam ROM - Anda tidak perlu mengetahui alamat setiap rutin, hanya kode ID dan titik masuk utama. Ini membuat kode Anda lebih portabel.

Namun, pada sistem yang lebih kompleks, interupsi perangkat lunak dapat berjalan dalam lingkungan yang sama sekali berbeda, yang dikenal sebagai konteks kernel . Biasanya aplikasi Anda akan berjalan dalam konteks pengguna yang dilindungi yang memiliki akses terbatas ke sumber daya. Hanya ketika berjalan dalam konteks kernel Anda dapat melakukan tugas-tugas yang lebih rumit - bahkan beberapa sistem bahkan membatasi instruksi mana yang dapat dieksekusi, sehingga Anda memerlukan mekanisme untuk memicu kode dalam konteks kernel - dan untuk itu digunakan interupsi.

Majenko
sumber
1
Juga, interupsi dapat secara sewenang-wenang menghentikan kemajuan suatu program sehingga sistem dapat melakukan sesuatu yang lain (mis. Interupsi perangkat keras). Program Anda tidak perlu mempertimbangkan hal ini, karena, dari sudut pandang program Anda, keadaan fungsi tidak berubah dari saat interupsi terjadi. Pada sistem yang lebih lama, ini adalah bagaimana program TSR (Terminate / Stay Resident) disimulasikan multitasking, dengan mengaitkan penghitung waktu / jam. Bahkan tanpa level IOPL, ada manfaatnya, katakanlah, menjaga sistem tetap terkini.
phyrfox
4
Mungkin juga perhatikan bahwa "interupsi perangkat lunak" tersebut juga disebut sebagai "interupsi sinkron", karena kode aplikasi tahu persis kapan dan mengapa interupsi tersebut terjadi, sebagai lawan dari "interupsi asinkron" yang mungkin, dari sudut pandang para aplikasi, pada dasarnya terjadi kapan saja dengan cara yang tidak diminta.
JimmyB
@HannoBinder: Saya pikir OP berbicara tentang memposting permintaan interupsi ke pengontrol interupsi vektor-Cortex-M3; jika kode untuk interupsi berprioritas tinggi memprioritaskan lebih rendah, permintaan akan ditunda sampai beberapa waktu kemudian ketika semua interupsi dengan prioritas tinggi telah selesai.
supercat
12

Interupsi perangkat lunak dapat digunakan untuk menyelesaikan tugas interupsi dengan prioritas lebih rendah. Waktu kode kritis sering diberi prioritas tinggi untuk menghindari terlalu banyak latensi. Setelah bagian waktu kritis selesai, mungkin ada tugas-tugas tambahan yang mungkin terlalu penting waktu untuk loop utama, tetapi tidak begitu penting untuk menahan interupsi prioritas tinggi lainnya. Memicu interupsi perangkat lunak prioritas rendah dapat melakukannya.

Sebagai contoh, misalkan Anda memiliki beberapa motor stepper masing-masing dengan timer sendiri. Pemutus waktu diberi prioritas tinggi untuk meminimalkan langkah jitter. Tugas kritis paling waktu mungkin sesederhana mengatur atau membersihkan pulsa langkah atau memajukan output fase. Mungkin ada fungsi tambahan yang diperlukan seperti perhitungan jalur percepatan, pemrosesan sensor, dll. Karena ini perlu diproses setiap langkah, mungkin tidak tepat untuk memproses ini dari main () karena waktu putaran utama mungkin terlalu lama. Tugas tambahan ini dapat diproses oleh interupsi perangkat lunak prioritas rendah sehingga tidak menambah latensi saluran stepper prioritas tinggi lainnya.

Apa perbedaan antara interupsi perangkat lunak dan suatu fungsi?

Suatu fungsi dipanggil segera dari mana pun ia dipanggil dan tidak mengubah tingkat prioritas interupsi saat ini jika dipanggil dari interupsi. Interupsi perangkat lunak adalah pemicu interupsi yang akan menyebabkan interupsi dipanggil ketika prioritas itu muncul. Jika panggilan fungsi dimasukkan pada akhir interupsi prioritas tinggi, fungsi tersebut akan terkandung dalam prioritas tinggi tersebut. Dengan memicu interupsi perangkat lunak prioritas rendah dan kemudian kembali dari interupsi prioritas tinggi, fungsi dipanggil pada prioritas baru (lebih rendah).

Tut
sumber
2
Pola umum lainnya mungkin memiliki interupsi 100KHz untuk menangani hal-hal yang sangat menentukan waktu, dan juga memerlukan centang timer 1kHz, tetapi tidak memiliki dua timer terpisah yang tersedia. Tidak butuh banyak waktu sementara untuk interupsi rutin 100kHz untuk mengatakan if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; Interupsi lain kemudian dapat melakukan hal tersebut dan dengan interupsi yang dinonaktifkan sebentar, tambahkan 100 ke timer_count; bahkan jika rutin 1kHz membutuhkan lebih dari 10 kita untuk menjalankannya tidak akan mengganggu yang 100kHz.
supercat
Dengan cara yang sama, saya telah menggunakan interupsi perangkat lunak dalam sistem sederhana (tanpa RTOS penuh) sebagai pseudo-scheduler, di mana persyaratan perangkat keras ditangani oleh ISR, tetapi fungsi panggilan balik dan tugas panjang lainnya yang dilakukan sebagai respons terhadap perubahan dalam Status perangkat keras didelegasikan ke interupsi perangkat lunak.
Evil Dog Pie
Anda pada dasarnya menggambarkan variasi "bagian bawah". Apakah Anda punya referensi untuk ini yang juga disebut "interupsi perangkat lunak"? Ini makna yang sangat berbeda dari jawaban Majenko, dan pertanyaannya ditandai ARM - arsitektur sebenarnya memiliki instruksi SWI (peranti lunak interupsi).
domen
3
@anda saya tidak yakin referensi seperti apa yang Anda butuhkan. Ini disebut "interupsi perangkat lunak" karena itulah yang digunakan untuk mencapainya. Dalam konteks ARM, OP secara khusus mereferensikan STM32 dan memberikan tautan ke manual referensi RM0008. Ini bukan manual referensi inti ARM. Satu-satunya "interupsi perangkat lunak" yang dicakup dalam RM0008 adalah EXTI_SWIER (register peristiwa interupsi perangkat lunak) yang dapat digunakan untuk menghasilkan interupsi perangkat lunak apakah pin perangkat keras aktual digunakan untuk interupsi. Saya belum menggunakan instruksi SWI (SWC) secara pribadi.
Tut
Terima kasih! Mungkin baik untuk memasukkan beberapa informasi ini dalam jawaban, untuk memperjelas "software interrupt" yang mana.
domen
7

Untuk sedikit memperluas jawaban Majenko, interupsi perangkat lunak digunakan untuk mengimplementasikan sistem operasi, khususnya antarmuka sistem panggilan. Ini berarti bahwa aplikasi tidak perlu dihubungkan dengan sistem operasi untuk melakukan panggilan fungsi, dan saklar konteks memungkinkan OS untuk membatasi akses ke perangkat keras dan mengambil keuntungan dari hal-hal seperti memori yang dilindungi.

Jika Anda tidak menggunakan OS dan Anda mengontrol semua kode pada MCU, Anda mungkin tidak perlu menggunakan interupsi perangkat lunak. (Meskipun seperti yang disebutkan Tut, mereka dapat memiliki kegunaan lain.)

The Linux dan MS-DOS system call interface pada penggunaan x86 interupsi perangkat lunak, jadi saya akan link ke mereka sebagai contoh.

Adam Haun
sumber
1
Dan dalam banyak kasus di mana os menggunakan soft interupsi, mereka dibungkus fungsi untuk membuat hidup lebih sederhana.
Hildred
1
Saya masih memprogram hal-hal (baru juga) untuk DOS, dan saya sangat akrab dengan penangan int 21. Hampir semua yang saya butuhkan I / O bijaksana ditangani dengan DOS ISR.
R Drast
Perhatikan bahwa halaman yang dikutip untuk Linux adalah dari tahun 1993-1996.
CVn
Saya mengganti tautannya dengan yang lebih baru.
Adam Haun