Ampirik sonuçlar!
Diğer cevaplar düşünceli ve iyi gerekçeli olmakla birlikte, hepsi eksik veya sadece varsayımdır. Belgelerin belirsiz olduğu durumlarda, denemeliyiz ve her vakayı test etmeliyiz.
Bu soru kesin bir cevabı hak ediyor, bu yüzden bir AVR çıkaralım ve bazı bitler ayarlamaya başlayalım!
prosedür
Test etmek için küçük bir Arduino (ATMEGA328P) programı yaptım ...
- asla döndürmeyecek bir ISR ayarlayın (
while (1)
)
- ISR'yi yazılımda tetikleyebileceğim bir kaynağa atadı (
INT0
azalıyor)
- engelli kesintileri
- etkinleştirildi ve kesilmeyi tetikledi, böylece beklemede olacak
Kesmeler etkinleştirildikten sonra tek talimatta bir LED'i açacak bir test yatağı kullandım. Test yatağında kesintileri etkinleştirmenin ve LED'leri kontrol etmenin farklı yollarını deneyerek, etkinleştirme talimatından sonra talimatın yürütülüp yürütülmediğini söyleyebilirim.
LED yanmazsa, ISR'nin kesintiler etkinleştirildikten hemen sonra yürütüldüğünü (ve kilitlendiğini) biliyorum.
LED yanmışsa, ISR çağrılmadan önce bir sonraki talimatın yürütülmesine izin verildiğini biliyorum.
Sonuçlar
SEI
talimat (temel durum)
Kod:
sei
Sonuç: LED yanıyor. Aşağıdaki talimat yürütüldü.
OUT
talimat
Kod:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
Sonuç:
LED yanıyor. Aşağıdaki talimat yürütüldü.
ST
talimat
Kod:
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
Sonuç:
LED yanıyor. Aşağıdaki talimat yürütüldü.
Sonuç!
S: Bekleme, SEI talimatının veya durum kaydının bir özelliği mi?
C: Değişen anlaşılmaktadır I
içinde biraz SREG
bir mesafede olan 0
bir karşı 1
bakılmaksızın talimat biti ayarlamak için kullanılır ne, bekleyen bir kesme olsa bile şu talimat sonraki yürütmek için izin verecektir.
notlar
Bu aslında birçok komplikasyonla çok ilginç bir soruya dönüştü. Eğer detayları ile ilgileniyorsanız, bir göz atın ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/