Instruksi AVR SEI ( http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html ) menunggu instruksi berikutnya selesai sebelum mengaktifkan interupsi.
Jika saya menggunakan instruksi lain untuk mengatur flag I di SREG, apakah ini juga akan menunggu 1 instruksi?
Dengan kata lain: Apakah tunggu fitur instruksi SEI atau register status?
Jika ini adalah fitur dari instruksi SEI, maka pada titik apakah flag benar-benar ditetapkan, dalam siklus yang mengeksekusi SEI atau dengan instruksi selanjutnya?
avr
interrupts
assembly
jayjay
sumber
sumber
Jawaban:
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 ...
while (1)
)INT0
semakin rendah)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
petunjukKode:
Hasil:
Memimpin. Instruksi berikut dijalankan.
ST
petunjukKode:
Hasil:
Memimpin. Instruksi berikut dijalankan.
Kesimpulan!
T: Apakah tunggu fitur instruksi SEI atau register status?
A: Tampaknya mengubah
I
bit dalamSREG
adalah dari0
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/
sumber
Ini adalah pemahaman saya dari dokumentasi bahwa melakukan
sei
instruksi tidak berbeda dari langsung menulis 1 ke bit I SREG. Keuntungan dari instruksi ini adalah Anda tidak perlu memuat nilai terlebih dahulu1<<I
ke register yang berfungsi untuk mengubah SREG, sehingga menghemat waktu.Untuk menguraikan, gunakan
sei
:Mengatur bit menggunakan
sbi
(hanya akan bekerja jika SREG berada di bawah 32 byte dari register register, tetapi tampaknya pada sebagian besar jika tidak semua tidak.)Menulis untuk saya bit langsung di SREG:
The
I
bit harus ditetapkan di sreg segera setelahsei
instruksi (atausbi
atauout
) selesai. Namun, setiap interupsi yang tertunda tidak akan ditangani sampai setelah instruksi berikutnya selesai - bit akan ditetapkan, tetapi dibutuhkan siklus tambahan untuk interupsi yang akan diaktifkan. Karena interupsi tidak dapat ditangani di tengah instruksi, dan beberapa instruksi membutuhkan lebih dari satu siklus untuk dieksekusi, mereka menentukan waktu yang diperlukan untuk diaktifkan sebagai satu instruksi. Ini harus menjadi kasus untuk semua versi kode - yaitu masing-masing di atas akan menyebabkan keterlambatan instruksi.Setelah sedikit mencari, saya menemukan utas ini di forum Arduino di mana beberapa tes berbeda dilakukan untuk memverifikasi perilaku. Tampaknya setuju dengan apa yang saya katakan di atas.
Selanjutnya, menurut utas itu, jika
I
bendera sudah diatur, maka tidak ada respons tertunda dari interupsi yang disebabkan olehsei
yang menyiratkan bahwa respons tertunda bukan disebabkan oleh instruksi itu sendiri, melainkan pada perangkat keras internal yang dikendalikan olehI
bendera - jadi setiap operasi yang mengubah bendera di SREG, baik itusei
atauout
atausts
akan memiliki perilaku yang persis sama.sumber
SBI
tidak dapat digunakan untuk mengaturI
bitSREG
sehingga kode apa pun yang melakukan ini kemungkinan tidak benar-benar diuji dalam kehidupan nyata karena bahkan tidak akan berkumpul.SBI
hanya dapat beroperasi pada 32 register yang lebih rendah dan SREG ada di slot 63.out
adalah yang saya gunakan pada awalnya. Saya pikir saya akan menemukan AVR (mungkin ATTiny) yang memiliki SREG di 32 register yang lebih rendah, tetapi saya mungkin membayangkannya.IMHO apakah menulis ke SREG masih menunda 1 instruksi dapat diuji seperti ini (pseudocode):
Sayangnya saya tidak punya waktu untuk melakukannya :(
sumber
Bukan itu yang dikatakan. Dokumentasi mengatakan
bukannya menunggu instruksi selanjutnya. Saya membaca ini karena flag diset segera tetapi meskipun diaktifkan, tidak ada interupsi yang akan ditangani sampai instruksi berikutnya dijalankan.
sumber