1
ARM Processors / Re: STM32F1 interrupt
« on: September 20, 2020, 02:11:55 pm »ท่านใดให้อธิบายการเกิดอินเตอรัพท์สักหน่อย ก็จะอธิบายตามความเข้าใจนะ ถ้าเกิด interrupt อย่างเช่น EXTI0 interrupt, Program Counter จะกระโดดมาที่ Address 0x0000 0058 ก่อน แล้วที่ Address 0x0000 0058 นี้ จะบรรจุคำสั่งให้กระโดดไปที่โปรแกรมย่อย Interrupt Service Routine EXTI0 อีกที เมื่อปฏิบัติตามคำสั่งใน Interrupt Service Routine EXTI0 เสร็จแล้ว ก็จะกระโดกลับไปที่โปรแกรม main(); ในบรรทัดก่อนที่จะเกิดการอินเตอรัพท์ เพื่อปฏิบัติคำสั่งต่อไป
ปล. อ่านแล้วเข้าใจกันไหม พอจะจำได้เคยแปล Atmega328p มาก่อน คงจะเหมือนกัน ท่านมีอะไรเสริมก็ว่ามาได้นะครับ
ใน ARM Cortex M ขั้นตอนตรงนี้มันไม่อยู่ในส่วนที่เราเข้าไป track ดูได้ครับ
ใน Address 0x00000058 จะแค่เก็บ Address ของ Interrupt Service Routine EXTI0 เท่านั้นครับ
ไม่มี Code สำหรับ Jump ไปที่ Interrupt Service Routine ของ EXTI0 แต่อย่างใดครับ
ผมก็ไม่แน่ใจว่ามันมีการ Jump ไปยัง code ส่วนไหนก่อนรึเปล่า ใน Code เราจะเห็นแค่ว่าโปรแกรมทำงานอยู่ใน main
แล้วอยู่ๆ ก็มาโผล่ใน Interrupt Service Routine เลย พอทำงานใน Interrupt Service Routine เสร็จ ก็กลับมาที่ main
บางทีการโหลด Address แล้ว Jump ไป Interrupt Service Routine อาจทำโดย Hardware แต่เราสามารถดูได้ว่า
ทันทีที่มีเข้าสู่ Interrupt Service Routine มันจะมีการ Backup Register R0 - R3, R12, LR, PSR และ Address
ที่จะ Return กลับไป ลง Stack ส่วนเวลา Return กลับไปยัง Main มันไม่ได้ Return ไป Address ที่จะกลับไปใน Main โดยตรง
มันจะ Return ไปส่วนที่เรียกว่า EXC_RETURN code (มี Address อยู่ในช่วง 0xF0000000 - 0xFFFFFFFF) ซึ่งมันจะเป็นการ
execute แบบพิเศษ ไม่ได้เป็น instruction set แบบปกติ