Hasil empiris!
Sementara jawaban lainnya bijaksana dan beralasan, semuanya tidak lengkap atau hanya dugaan. Jika dokumentasinya ambigu, kita harus bereksperimen dan kita harus menguji setiap kasus.
Pertanyaan ini layak mendapatkan jawaban konklusif, jadi mari kita tarik AVR dan mulai mengatur beberapa bit!
Prosedur
Untuk menguji, saya membuat program Arduino (ATMEGA328P) kecil yang akan ...
- menyiapkan ISR yang tidak akan pernah kembali (
while (1)
)
- menetapkan ISR ke sumber yang dapat saya picu dalam perangkat lunak (
INT0
semakin rendah)
- interupsi yang dinonaktifkan
- diaktifkan dan memicu interupsi sehingga akan tertunda
Saya menggunakan test bed yang akan menyalakan LED dalam instruksi tunggal setelah interupsi diaktifkan. Dengan mencoba berbagai cara untuk mengaktifkan interupsi di test bed dan memeriksa LED, saya dapat mengetahui apakah instruksi setelah instruksi yang diaktifkan dijalankan atau tidak.
Jika LED tidak menyala, maka saya tahu bahwa ISR dieksekusi (dan dikunci) segera setelah interupsi diaktifkan.
Jika LED menyala, maka saya tahu bahwa instruksi selanjutnya diizinkan untuk dieksekusi sebelum ISR dipanggil.
Hasil
SEI
instruksi (kasus dasar)
Kode:
sei
Hasil: LED menyala. Instruksi berikut dijalankan.
OUT
petunjuk
Kode:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
Hasil:
Memimpin. Instruksi berikut dijalankan.
ST
petunjuk
Kode:
clr r29 // Clear Y high byte
ldi r28,0x5f // Set Y low byte to point to SREG
ld r16, Y // Get SREG
ori r16,128 // Set I bit
st Y,r16 // Put SREG
Hasil:
Memimpin. Instruksi berikut dijalankan.
Kesimpulan!
T: Apakah tunggu fitur instruksi SEI atau register status?
A: Tampaknya mengubah I
bit dalam SREG
adalah dari 0
a1
akan memungkinkan instruksi berikut untuk dieksekusi berikutnya bahkan jika ada interupsi yang tertunda, terlepas dari instruksi apa yang digunakan untuk mengatur bit.
Catatan
Ini sebenarnya berubah menjadi pertanyaan yang sangat menarik dengan banyak komplikasi. Jika Anda tertarik dengan perinciannya, lihat ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/