ผลเชิงประจักษ์!
ในขณะที่คำตอบอื่น ๆ มีความคิดและมีเหตุผลดีพวกเขาทั้งหมดไม่สมบูรณ์หรือเพียงแค่คาดเดา ในกรณีที่เอกสารไม่ชัดเจนเราต้องทำการทดสอบและต้องทดสอบทุกกรณี
คำถามนี้ควรได้รับคำตอบที่เป็นข้อสรุปดังนั้นเรามาดึง AVR และเริ่มตั้งค่าบิต!
ขั้นตอน
ในการทดสอบฉันทำโปรแกรม Arduino (ATMEGA328P) เล็ก ๆ น้อย ๆ ที่จะ ...
- ตั้งค่า ISR ที่จะไม่ส่งคืน (
while (1)
)
- กำหนด ISR ให้กับแหล่งที่ฉันสามารถทริกเกอร์ในซอฟต์แวร์ (
INT0
กำลังเหลือน้อย)
- คนพิการขัดจังหวะ
- เปิดใช้งานและเริ่มต้นการขัดจังหวะดังนั้นมันจะค้างอยู่
ฉันใช้เตียงทดสอบที่จะเปิดไฟ LED ในคำสั่งเดียวหลังจากเปิดใช้งานอินเทอร์รัปต์ ด้วยการลองใช้วิธีการขัดจังหวะที่แตกต่างกันในเตียงทดสอบและตรวจสอบไฟ LED ฉันสามารถบอกได้ว่าคำสั่งหลังจากเปิดใช้งานคำสั่งถูกเปิดใช้งานหรือไม่
หากไฟ LED ไม่ติดขึ้นฉันรู้ว่า ISR ดำเนินการ (และล็อค) ทันทีหลังจากการขัดจังหวะถูกเปิดใช้งาน
หากไฟ LED ติดสว่างแสดงว่าฉันรู้ว่าคำสั่งถัดไปได้รับอนุญาตให้ทำงานก่อนที่จะเรียก ISR
ผล
SEI
การเรียนการสอน (กรณีฐาน)
รหัส:
sei
ผล: LED บน ดำเนินการตามคำสั่ง
OUT
คำแนะนำ
รหัส:
in r16,0x3f // Get SREG
ori r16,128 // Set I bit
out 0x3f,r16 // Save back to SREG
ผลลัพธ์:
ไฟ LED ดำเนินการตามคำสั่ง
ST
คำแนะนำ
รหัส:
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
ผลลัพธ์:
ไฟ LED ดำเนินการตามคำสั่ง
สรุป!
ถาม: คุณสมบัติการรอคอยของคำสั่ง SEI หรือการลงทะเบียนสถานะเป็นอย่างไร
ตอบ: ดูเหมือนว่าการเปลี่ยนI
บิตในSREG
จาก a เป็น0
a 1
จะอนุญาตให้คำสั่งต่อไปนี้ดำเนินการต่อไปแม้ว่าจะมีการขัดจังหวะที่ค้างอยู่โดยไม่คำนึงถึงคำสั่งใดที่ใช้ในการตั้งค่าบิต
หมายเหตุ
จริง ๆ แล้วกลายเป็นคำถามที่น่าสนใจมากที่มีภาวะแทรกซ้อนมากมาย หากคุณสนใจรายละเอียดของเขาลองดู ...
http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/