AVR là một kiến trúc RISC, vì vậy nó có xử lý phần cứng khá cơ bản của các ngắt. Hầu hết các bộ xử lý gây rối với ngăn xếp trong khi ngắt, mặc dù có một vài, đáng chú ý nhất là ARM và PowerPC, sử dụng các phương thức khác nhau.
Trong mọi trường hợp, đây là những gì mà AVR làm cho các ngắt:
Khi xảy ra gián đoạn, phần cứng bộ xử lý thực hiện các bước này, đây không chỉ là một GOTO đơn giản:
- Kết thúc hướng dẫn hiện tại.
- Vô hiệu hóa cờ ngắt toàn cầu.
- Nhấn địa chỉ của lệnh tiếp theo trên ngăn xếp.
- Sao chép địa chỉ trong vectơ ngắt chính xác (theo ngắt đã xảy ra) vào bộ đếm chương trình.
Bây giờ, tại thời điểm này, phần cứng đã làm tất cả những gì nó sẽ làm. Phần mềm phải được viết chính xác để không phá vỡ mọi thứ. Thông thường, các bước tiếp theo là dọc theo các dòng này.
Đẩy thanh ghi trạng thái lên ngăn xếp. (Điều này phải được thực hiện trước khi nó được thay đổi).
Đẩy bất kỳ thanh ghi CPU nào sẽ (hoặc có thể) thay đổi lên ngăn xếp. Những thanh ghi nào cần được lưu theo cách này được xác định bởi mô hình lập trình. Mô hình lập trình được xác định bởi trình biên dịch.
Bây giờ mã ngắt làm việc có thể được chạy. Để trả lời trường hợp trong câu hỏi gọi hàm, nó chỉ làm những gì nó luôn làm, đẩy giá trị trả về trên ngăn xếp, sau đó bật lại khi hoàn thành. Điều này không ảnh hưởng đến bất kỳ giá trị nào trước đây mà chúng tôi đã lưu trên ngăn xếp cho đến bây giờ.
- Chạy mã làm việc ISR.
Bây giờ chúng tôi đã hoàn thành và muốn trở về từ ngắt. Đầu tiên chúng ta phải làm sạch phần mềm.
- Bật các thanh ghi CPU mà chúng ta đã đẩy ở bước 6.
- Đưa giá trị trạng thái đã lưu trở lại vào thanh ghi trạng thái. Sau này, chúng ta phải cẩn thận không thực hiện bất kỳ lệnh nào có thể thay đổi thanh ghi trạng thái.
Thực hiện hướng dẫn RTI. Phần cứng thực hiện các bước này cho hướng dẫn này:
a. Cho phép cờ ngắt toàn cầu. (Lưu ý rằng ít nhất một lệnh phải được chạy trước khi ngắt tiếp theo sẽ được thực hiện. Điều này ngăn chặn các ngắt nặng ngăn chặn hoàn toàn công việc nền.)
b. Bật địa chỉ trả lại đã lưu vào PC.
Bây giờ chúng tôi trở lại mã bình thường.
Lưu ý rằng có một số điểm chúng tôi phải rất cẩn thận, đặc biệt là xung quanh thanh ghi trạng thái và các thanh ghi lưu có thể được thay đổi. May mắn thay nếu bạn đang sử dụng trình biên dịch C, tất cả điều này được xử lý dưới vỏ bọc.
Ngoài ra, bạn phải xem độ sâu ngăn xếp của bạn. Tại bất kỳ thời điểm nào khi ngắt được kích hoạt, ISR có thể sử dụng nhiều ngăn xếp hơn là hiển nhiên bằng cách xem mã địa phương. Tất nhiên, điều này thực sự không xuất hiện nhiều trừ khi bạn đang đẩy bộ nhớ của mình đến giới hạn của nó.
Dưới đây là một liên kết mô tả quá trình này nếu bạn muốn một tài liệu tham khảo.