คำสั่ง AVR SEI


13

คำสั่ง AVR SEI ( http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html ) รอให้คำสั่งถัดไปเสร็จสิ้นก่อนที่จะเปิดใช้อินเทอร์รัปต์

ถ้าฉันใช้คำสั่งอื่นเพื่อตั้งค่าสถานะ I ใน SREG สิ่งนี้จะรอ 1 คำสั่งด้วยหรือไม่

กล่าวอีกนัยหนึ่ง: การรอคุณลักษณะของคำสั่ง SEI หรือการลงทะเบียนสถานะหรือไม่

ถ้ามันเป็นคุณสมบัติของคำสั่ง SEI ดังนั้นธงจะตั้งค่าในจุดใดในรอบที่เรียกใช้ SEI หรือด้วยคำสั่งต่อไป


นี่เป็นคำถามที่ดี แต่ก็ไม่ควรทดสอบและแน่ใจเกินไป
Vorac

1
@Vorac คุณช่วยยกตัวอย่างวิธีทดสอบนี้ได้ไหม? นั่นจะเป็นคำตอบที่ฉันยอมรับอย่างแน่นอน
jayjay

1
มันอาจเป็นคุณสมบัติของการใช้งานสถาปัตยกรรม AVR และสามารถจัดการกับอินเตอร์รัปต์ได้ IIRC สถาปัตยกรรม AVR ใช้ขั้นตอนการทำงาน 3 ขั้นตอน ดังนั้นคำสั่งต่อไปอาจเป็น 'ในเที่ยวบิน' (เช่นในขั้นตอนไปป์ไลน์หนึ่งหรือมากกว่านั้น) ก่อนการเปลี่ยนสถานะ I สามารถใช้เพื่อตรวจสอบการขัดจังหวะ ฉันไม่ได้ค้นหามานาน แต่ฉันไม่คิดว่าผู้ออกแบบสถาปัตยกรรม AVR จะมีข้อ จำกัด มากเกินไป ดังนั้นการทดสอบการขัดจังหวะการเรียนการสอนในขั้นตอนที่ 1 ของไปป์ไลน์และไม่ก่อนการสอนครั้งต่อไป (ในระยะที่ 2) จะให้ความยืดหยุ่น
gbulmer

คำตอบ:


8

ผลเชิงประจักษ์!

ในขณะที่คำตอบอื่น ๆ มีความคิดและมีเหตุผลดีพวกเขาทั้งหมดไม่สมบูรณ์หรือเพียงแค่คาดเดา ในกรณีที่เอกสารไม่ชัดเจนเราต้องทำการทดสอบและต้องทดสอบทุกกรณี

คำถามนี้ควรได้รับคำตอบที่เป็นข้อสรุปดังนั้นเรามาดึง AVR และเริ่มตั้งค่าบิต!

ขั้นตอน

ในการทดสอบฉันทำโปรแกรม Arduino (ATMEGA328P) เล็ก ๆ น้อย ๆ ที่จะ ...

  1. ตั้งค่า ISR ที่จะไม่ส่งคืน ( while (1))
  2. กำหนด ISR ให้กับแหล่งที่ฉันสามารถทริกเกอร์ในซอฟต์แวร์ ( INT0กำลังเหลือน้อย)
  3. คนพิการขัดจังหวะ
  4. เปิดใช้งานและเริ่มต้นการขัดจังหวะดังนั้นมันจะค้างอยู่

ฉันใช้เตียงทดสอบที่จะเปิดไฟ 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 เป็น0a 1จะอนุญาตให้คำสั่งต่อไปนี้ดำเนินการต่อไปแม้ว่าจะมีการขัดจังหวะที่ค้างอยู่โดยไม่คำนึงถึงคำสั่งใดที่ใช้ในการตั้งค่าบิต

หมายเหตุ

จริง ๆ แล้วกลายเป็นคำถามที่น่าสนใจมากที่มีภาวะแทรกซ้อนมากมาย หากคุณสนใจรายละเอียดของเขาลองดู ...

http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/


2
เมื่อข้อมูลจำเพาะไม่ชัดเจนจะมีปัญหากับ "ผลลัพธ์เชิงประจักษ์" เพียงเพราะชิ้นส่วนเฉพาะของฮาร์ดแวร์ที่คุณทดสอบทำงานในลักษณะเฉพาะไม่ได้หมายความว่าชิ้นส่วนอื่นจะทำงานในลักษณะนั้น Atmel มีอิสระในการเปลี่ยนแปลงการใช้งานหากไม่เปลี่ยนแปลงข้อกำหนด ดังนั้น "ในกรณีที่เอกสารไม่ชัดเจน ... " ยังคงเป็นอย่างนั้นหลังจากการทดสอบและการทดสอบแล้วยังคงคลุมเครือ
gbulmer

@ gbulmer ฉันเห็นด้วย 100% ผู้ที่ใช้คุณลักษณะที่ไม่มีเอกสารในการผลิตจะต้องเสียใจ ยังเป็นคำถามเชิงประจักษ์ที่น่าสนใจ (และคำตอบ) และอาจโอเคที่จะพึ่งพาโครงการส่วนบุคคลแบบครั้งเดียว
bigjosh

ใช่คุณทำการสอบสวนที่น่าสนใจ
gbulmer

4

มันเป็นความเข้าใจของฉันจากเอกสารที่ปฏิบัติตามseiคำสั่งไม่ต่างจากการเขียน 1 โดยตรงไปยัง IRE ของ SREG ข้อได้เปรียบของการเรียนการสอนคือคุณไม่จำเป็นต้องโหลดค่า1<<Iลงในทะเบียนทำงานเพื่อเปลี่ยน SREG ซึ่งจะช่วยประหยัดเวลา

หากต้องการทำอย่างละเอียดโดยใช้sei:

sei ; One cycle

การตั้งค่าบิตโดยใช้sbi(จะใช้ได้เฉพาะเมื่อ SREG อยู่ในแผนที่ขนาด 32 ไบต์ด้านล่าง แต่ดูเหมือนว่าส่วนใหญ่ถ้าไม่ใช่ทั้งหมดนั้นไม่ใช่)

sbi SREG,7 ; Two cycles

เขียนถึงฉันโดยตรงใน SREG:

in  r24,SREG ;
ori r24,0x80 ;
out SREG,r24 ; Three cycles

Iบิตควรจะตั้งอยู่ใน SREG ทันทีที่seiการเรียนการสอน (หรือsbiหรือout) เสร็จสมบูรณ์ อย่างไรก็ตามอินเตอร์รัปต์ใด ๆ ที่ค้างอยู่จะไม่ได้รับการจัดการจนกระทั่งหลังจากคำสั่งถัดไปเสร็จสมบูรณ์บิตจะถูกตั้งค่า แต่จะใช้รอบพิเศษเพื่อให้อินเทอร์รัปต์เปิดใช้งาน เนื่องจากอินเตอร์รัปต์ไม่สามารถจัดการคำสั่งกลางได้และคำสั่งบางอย่างใช้เวลามากกว่าหนึ่งรอบในการดำเนินการพวกเขาจึงระบุเวลาที่จะเปิดใช้งานเป็นคำสั่งเดียว นี่ควรเป็นกรณีสำหรับรหัสทุกเวอร์ชัน - เช่นแต่ละข้อด้านบนจะทำให้คำสั่งล่าช้า


หลังจากการค้นหาเล็กน้อยฉันพบกระทู้นี้ในฟอรัม Arduino ซึ่งมีการทดสอบที่แตกต่างกันหลายอย่างเพื่อตรวจสอบพฤติกรรม ดูเหมือนว่าจะเห็นด้วยกับสิ่งที่ฉันพูดข้างต้น

นอกจากนี้ตามเธรดนั้นหากมีการIตั้งค่าสถานะไว้แล้วจะไม่มีการตอบสนองล่าช้าของการขัดจังหวะที่เกิดจากการseiที่หมายความว่าการตอบสนองล่าช้านั้นไม่ได้เกิดจากคำสั่งของตัวเอง แต่ในฮาร์ดแวร์ภายในที่ควบคุมโดยIธง - เพื่อให้การดำเนินการใด ๆ ซึ่งการเปลี่ยนแปลงธงใน SREG ไม่ว่าจะเป็นseiหรือoutหรือstsจะมีว่าพฤติกรรมเดียวกัน


ดังนั้นจึงไม่มีแง่มุมของการชะลอการทำงานเฉพาะสำหรับ SEI แต่ไม่ใช่ OUT ที่อนุญาตให้คำสั่งต่อไปนี้เสร็จสมบูรณ์หรือไม่
Brian Drummond

ในกรณีของตัวอย่างที่สองของคุณจะถูกขัดจังหวะเมื่อใด รอบแรกมีความล่าช้าหรือไม่?
jayjay

@jayjay ดูการอัปเดตของฉัน
Tom Carpenter

1
โปรดทราบว่าSBIไม่สามารถใช้ในการตั้งค่าIบิตSREGเพื่อให้รหัสที่เป็นไปได้นี้ไม่ได้ทดสอบจริงในชีวิตจริงเพราะมันจะไม่ได้รวบรวม SBIสามารถทำงานกับ32 register ที่ต่ำกว่าและ SREG อยู่ที่ slot 63
bigjosh

@bigjosh ตัวอย่าง SBI คือสิ่งที่ฉันคิดในภายหลัง - outเป็นสิ่งที่ฉันใช้มา แต่เดิม ฉันคิดว่าฉันเจอ AVR (อาจเป็น ATTiny) ที่มี SREG ในการลงทะเบียนต่ำกว่า 32 แต่ฉันอาจจะจินตนาการ
Tom Carpenter

1

IMHO เขียนถึง SREG ยังคงหน่วงเวลา 1 คำสั่งสามารถทดสอบได้เช่นนี้ (pseudocode):

ISR() { PORTA = 0; while(1); }
main() 
{
    cli();
    DDRA = 0xff;
    configure_isr_for_level_interrupt_that_will_trigger_immediately();
    SREG = 0xff;
    cli();
    PORTA = 0xff;
    while(1);
}

น่าเสียดายที่ฉันไม่มีเวลาทำ :(


0

นั่นไม่ใช่สิ่งที่พูด เอกสารกล่าวว่า

การเรียนการสอนต่อไปนี้ SEI จะถูกดำเนินการก่อนที่จะขัดจังหวะใด ๆ ที่ค้างอยู่

ไม่ใช่ว่ามันจะรอคำสั่งต่อไป ฉันอ่านสิ่งนี้เมื่อตั้งค่าสถานะทันที แต่แม้ว่าจะเปิดใช้งานจะไม่มีการขัดจังหวะจนกว่าจะมีการเรียกใช้คำสั่งถัดไป


นี่เป็นเรื่องจริงทั้งหมด แต่คำถามของฉันคือ: พฤติกรรมนี้เฉพาะกับ SEI หรือไม่
jayjay

@Jayjay ฉันสงสัยว่านี่เป็นเพราะความยาวของขั้นตอนการสอน
crasic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.