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.
sumber
Jawaban:
Perbedaan utama antara fungsi dan interupsi perangkat lunak adalah apa yang dikenal sebagai konteks .
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.
sumber
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.
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).
sumber
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.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.
sumber