เปิดใช้งานอินเตอร์รัปต์ แต่ไม่มี ISR


10

ฉันอยากจะรู้ว่าจะเกิดอะไรขึ้นถ้าเปิดใช้งานอินเทอร์รัปต์ (ตัวอย่าง: Arbitration Lost Interrupt ใน CAN โมดูลของ LPC1778 ของ NXP) แต่ไม่มีการกำหนด ISR สำหรับการอินเตอร์รัป

เมื่อการขัดจังหวะเกิดขึ้นฉันรู้ว่าการตั้งค่าการขัดจังหวะตามลำดับจะได้รับการตั้งค่า แต่เนื่องจากฉันไม่ได้กำหนด ISR ใด ๆ จะไม่มีที่อยู่ใด ๆ ของเวกเตอร์ออฟเซ็ตขัดจังหวะที่เก็บไว้สำหรับการควบคุมการถ่ายโอน เป็นรูทีนหลักและฉันสามารถรีเซ็ตการตั้งค่าอินเตอร์รัปต์โดยการสำรวจในรูทีนหลัก (นี่คือสิ่งที่ฉันกำลังคิด) จะมีเวลาแฝงใด ๆ เมื่อ CPU รู้ว่าไม่มี ISR ที่จะข้ามไปหรือไม่

ทางออกใด ๆ ที่อาจเกิดขึ้นสามารถช่วยฉันได้จริงๆ

ขอบคุณ

ปรับปรุง:

ฉันเปิดใช้งาน CAN อินเตอร์รัปต์บน uC ของฉันได้ แต่ไม่ได้กำหนด ISR เมื่อฉันทำการทดสอบลูปแบ็คภายในรหัสที่ป้อนลงในลูปไม่สิ้นสุด นี่คือรหัส disassembly ของ infinite loop ที่ถูกเรียกใช้งานบน LPC1778:

B       .
ENDP

ดังนั้นถ้าคุณใช้อินเตอร์รัปต์ให้ใช้ ISR


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

คุณกำลังบอกว่ามีการตั้งค่าสถานะการขัดจังหวะการสูญหายของบัสอนุญาโตตุลาการแม้ว่าฉันจะไม่เปิดใช้งาน "การขัดจังหวะโดยบัสอนุญาโตตุลาการที่หายไป" (แม้ว่าจะไม่มีการลงทะเบียนสถานะที่สามารถระบุ Bus Arbitration ที่หายไปได้ยกเว้นการลงทะเบียนสถานะขัดจังหวะ)
AlphaGoku

ใช่. ในทุก MCU ที่ฉันทำงานด้วยจะมีการตั้งค่าสถานะอินเตอร์รัปต์เมื่อใดก็ตามที่เงื่อนไขซึ่งควรตั้งค่าเกิดขึ้น การเปิดใช้งานการขัดจังหวะสาเหตุ MCU เวกเตอร์ที่จะจัดการเมื่อธงที่เกี่ยวข้องมีการตั้งค่าและปิดการใช้งานสาเหตุขัดจังหวะมันจะไม่สนใจธงและไม่เวกเตอร์ไปยังตัวจัดการแม้ว่าธงเป็นชุด Dis / en-abling interrupt ส่งผลต่อลักษณะการทำงานข้ามไปยัง interrupt-handler เท่านั้นไม่ใช่พฤติกรรมการตั้งค่าสถานะ
brhans

ว้าวนั่นเป็นสิ่งที่ฉันไม่รู้ ขอบคุณมาก. ดังนั้นไดรเวอร์ทุกตัวจะต้องตรวจสอบการลงทะเบียนสถานะขัดจังหวะเป็นระยะและรีเซ็ตพวกเขาแม้จะไม่ได้เปิดใช้งานการขัดจังหวะ :)
AlphaGoku

@AkshayImmanuelD เฉพาะในกรณีที่มันสำคัญ หากการขัดจังหวะถูกปิดใช้งานอยู่ตลอดเวลาและไม่มีสิ่งอื่นใดที่เกี่ยวข้องกับการตั้งค่าสถานะแสดงว่าการตั้งค่าหรือการล้างข้อมูลนั้นไม่สำคัญ
ฮอบส์

คำตอบ:


17

หากไม่มีการกำหนด ISR ตำแหน่งสำหรับคำสั่งการกระโดดในเวกเตอร์ขัดจังหวะอาจเป็นโมฆะมันอาจเป็นการข้ามไปที่รูทีนข้อยกเว้นมันอาจข้ามไปที่จุดเริ่มต้นของโปรแกรมหรืออาจมี "ส่งคืนจาก คำสั่ง interrupt "(เช่น RTI)

นี่คือการแยกส่วนของตารางขัดจังหวะสำหรับตัวประมวลผล ATMega 16 ที่แสดงการขัดจังหวะที่ไม่ได้ใช้สามครั้ง vectored เป็นชุดคำสั่งที่จัดการกรณีดังกล่าว (มันอาจเข้าสู่วงวนไม่สิ้นสุด) และเวกเตอร์ที่ถูกต้อง

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

วิธีใดที่อธิบายไว้ก่อนหน้านี้ในการจัดการ ISR ที่หายไปนั้นขึ้นอยู่กับสถาปัตยกรรมของไมโครคอนโทรลเลอร์และคอมไพเลอร์ ในกรณีของ RTI หรือคำสั่งที่เทียบเท่ามันจะกลับไปที่แอปพลิเคชันทันที อย่างไรก็ตามหากการขัดจังหวะถูกเรียกระดับแทนที่จะเป็นการกระตุ้นจากขอบสิ่งนี้อาจทำให้การขัดจังหวะถูกเรียกอีกครั้งดังนั้นคุณจึงสิ้นสุดการวนซ้ำไม่สิ้นสุด

ฉันคิดว่ามันอาจขึ้นอยู่กับสถาปัตยกรรมของชิปไม่ว่าจะเป็นการขัดจังหวะภายใน (เช่นตัวละครที่ได้รับจาก UART) นั้นถือว่าเป็นระดับที่ถูกกระตุ้นหรือเรียกใช้ขอบ การขัดจังหวะจากภายนอกสามารถกำหนดค่าเป็นแบบใดแบบหนึ่ง

นอกจากนี้ยังมีอีกกรณีหนึ่งบางครั้งอินเทอร์รัปต์จำนวนมากถูกจัดกลุ่มเข้าด้วยกันและใช้เวกเตอร์เดียวกัน นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับโปรเซสเซอร์รุ่นเก่าซึ่งอาจมีการขัดจังหวะเพียงสองสามข้อ ในกรณีนั้นสาเหตุของการขัดจังหวะจะถูกกำหนดโดยการสำรวจสถานะของการลงทะเบียนขัดจังหวะซึ่งเป็นสิ่งที่คุณเสนอ

แต่มันเป็นวิธีปฏิบัติที่ไม่ดีไม่ว่าในกรณีใดก็ตามที่มีการขัดจังหวะในระบบและไม่มีการกำหนด ISR อย่าทำมัน


2
.... หรืออาจไม่ได้กำหนด
Wouter van Ooijen

@outervanOoijen นั่นคือสิ่งที่ฉันหมายถึงโดยเวกเตอร์ขัดจังหวะเป็นโมฆะ
tcrosley

1
การลงทะเบียนสถานะไม่สามารถระบุข้อผิดพลาดบางอย่างเช่นที่ฉันได้กล่าวไว้ข้างต้น แต่ข้อผิดพลาดดังกล่าวมีการขัดจังหวะ ดังนั้นฉันคิดว่าการเปิดใช้งานการขัดจังหวะเพียงเพื่อระบุข้อผิดพลาดและไม่ใช้ ISR ใด ๆ ในขณะที่จำลอง LPC1778 โดยใช้ Keil ฉันไม่ได้รับข้อยกเว้นดังนั้นฉันเดาว่า uC จะต้องใช้ RTI ตามที่คุณพูดถึง
AlphaGoku

1
สิ่งที่ต้องระวัง - หากคุณเปิดใช้งานการขัดจังหวะ แต่ตัวจัดการของคุณไม่ได้ล้างค่าสถานะ (หรือไม่มีตัวจัดการและพฤติกรรมเริ่มต้นคือการส่งคืนอย่างง่าย) จากนั้นคุณจะพบว่า MCU ของคุณจะจบลงตลอดไป ติดอยู่ในลูปขัดจังหวะ
brhans

1
PIO ขัดจังหวะบน ATSAM3X8E สามารถเรียกใช้ขอบ แต่เงื่อนไขการขัดจังหวะเมื่อตั้งค่าจะไม่ถูกล้างจนกว่าคุณจะอ่าน ISR (ลงทะเบียนสถานะขัดจังหวะ) ในการจัดการขัดจังหวะ - ส่งผลให้วง @brhans กล่าวถึง
Simon Wright

1

ขึ้นอยู่กับ MCU คอมไพเลอร์และรหัสที่เหลือของคุณ

จากประสบการณ์ของฉัน:

  1. AVR - โดยค่าเริ่มต้นหากคุณไม่ได้ระบุ ISR ดังนั้นเวกเตอร์ขัดจังหวะในแฟลชจะเป็น 0x0000 ซึ่งหมายความว่าแอปพลิเคชันของคุณจะเข้าสู่การรีเซ็ตทุกครั้งที่มีการขัดจังหวะนี้

    หากคุณต้องการการขัดจังหวะจริง ๆ แต่ไม่จำเป็นต้องใช้ตัวจัดการ (เช่นใช้โหมดการลดเสียงรบกวน ADC และใช้การขัดจังหวะเพื่อปลุก MCU เท่านั้น) คุณควรใช้แมโค EMPTY_INTERRUPT

  2. NXP Kinetis (ARM) - เวกเตอร์ทั้งหมดตามจุดเริ่มต้นไปยังตัวจัดการเริ่มต้นที่มีเบรกพอยต์ CPU จะหยุดและบอกให้ดีบักเกอร์ของคุณทราบ

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