สอบถามเรื่องการ Interrupt ซ้อน Interrupt ครับ

  • 21 Replies
  • 6078 Views
#INT_RB
void int_service1(void)
{
   คำสั่งที่ 1 ;
   
   
   คำสั่งที่ 4 ;   <<---------- เกิดการ Interrupt จาก EXT
   
   
   คำสั่งที่ n ;
}

#INT_EXT
void int_service2(void)
{
   คำสั่งที่ 1 ;
   คำสั่งที่ 2 ;
   
   
   คำสั่งที่ n ;
}

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

แล้วถ้าเป็นดังข้างต้น มีวิธีเขียนให้ ไม่รอให้ทำงานในฟังก์ชั่นอินเตอร์รัปต์ RB เสร็จ แล้วไปทำงานในฟังก์ชั่นอินเตอร์รัปต์ EXT ได้เลยไหมครับ

ขอบคุณครับ

ไม่ยากครับ
ลองศึกษาเรื่อง Interrupt Priority ดูครับ

*

Offline firmware.c

  • *****
  • 181
  • Firmware Design
    • View Profile
ศึกษา spec ของ MCU ครับว่ามี hardware multiple interrupt หรือไม่

1) ถ้ามีส่วนมากมันจะทำงานตาม priority ที่ตั้งไว้ ดังนั้นควรตั้ง INT_RB ให้มี priority ต่ำกว่า INT_EXT
2) ถ้าไม่มีจะต้องใช้ software multiple interrupt เข้าช่วยด้วยการ re-enable globals interrupt ข้างใน INT_RB routine เพื่อยอมให้สามารถทำงาน interrupt อื่นได้ก่อน (ผมไม่แน่ใจว่า pic ทำได้หรือไม่นะครับ)
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+

บนหัวโปรแกรมผมก็ได้ประกาศ #priority EXT,RB
แล้วเหมือนกันครับ ผลคือ มันก็เป็นดังข้างต้นที่กล่าวมาอ่ะครับ

** หมายเหตุ ผมใช้ PIC16F1939
Compiler: PIC C Compiler Version 4.140 **


ขอบคุณครับสำหรับคำแนะนำ

*

Offline JENG

  • *****
  • 808
  • รู้ทุกเรื่องเว้นเรื่องจริง
    • View Profile
pic16 ไม่น่าทำ interrupt ซ้อนได้ครับเพราะมี interrupt vector เดียว
ส่วน priority เกิดจากการลำดับการตรวจสอบ flag interrupt ที่เราเปิดไว้
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

pic16 ไม่น่าทำ interrupt ซ้อนได้ครับเพราะมี interrupt vector เดียว
ส่วน priority เกิดจากการลำดับการตรวจสอบ flag interrupt ที่เราเปิดไว้

สรุป คือ ทำไม่ได้ใช่ไหมครับ แล้ว PIC เบอร์ไหนที่สามารถทำได้บ้างครับ

ขอบคุณครับ

*

Offline JENG

  • *****
  • 808
  • รู้ทุกเรื่องเว้นเรื่องจริง
    • View Profile
pic16 ไม่น่าทำ interrupt ซ้อนได้ครับเพราะมี interrupt vector เดียว
ส่วน priority เกิดจากการลำดับการตรวจสอบ flag interrupt ที่เราเปิดไว้

สรุป คือ ทำไม่ได้ใช่ไหมครับ แล้ว PIC เบอร์ไหนที่สามารถทำได้บ้างครับ

ขอบคุณครับ

ผมไม่ทราบเหมือนกันครับ ถ้า interrupt ซ้อนได้ใน mcu 8bit ที่ผมเล่นมายังไม่เคยเจอเหมือนกัน
แต่คงมีวิธีการทาง software ช่วยได้ เดี่ยวรอผู้ชำนาญมาตอบให้ดีกว่า

ผมขอทราบเหตุผลได้มั๊ยครับว่าทำไมต้องการ interrupt ซ้อน เพราะจะต้องดูปัจจัยภายนอกด้วย
ว่าสมควรใช้จริงๆหรือปาว ส่วนใน interrupt เราจะไม่นิยมใส่ code ลงไปครับถ้าไม่จำเป็น
หรือถ้าจำเป็นก็จะเป็น code ที่ทำงานสั้นๆ หรือใช้ flag link สั่งงานนอก function interrupt แทน
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺