Làm thế nào để bộ điều khiển biết khi nào nên nhảy đến ISR?


12

Tôi đang nói về những thứ ở cấp độ cốt lõi.

Theo tôi hiểu, lõi điều khiển chỉ thực hiện các hướng dẫn được tìm nạp từ bộ nhớ (Tìm nạp - Giải mã - Thực thi). Khi một ngắt đến, lõi / ALU quyết định nhảy đến ISR như thế nào?

Bởi vì chúng tôi hoặc trình biên dịch, không thêm bất kỳ lệnh nào để thăm dò trạng thái ngắt - vậy làm thế nào để biết rằng một ngắt cần phải được phục vụ?

Câu trả lời:


13

Những gì bạn đang thiếu là cốt lõi không làm nhiều hơn là chỉ thực hiện opcodes mà được lấy từ bộ nhớ. Nó có logic cụ thể trong đó để thực hiện các ngắt.

Khi phần cứng phát hiện ngắt xác nhận tín hiệu cho biết đã đến lúc phải ngắt, thông thường một lệnh đặc biệt sẽ bị kẹt vào lõi không bao giờ được lấy từ bộ nhớ. Trong hầu hết các trường hợp, đây là một lệnh CALL đến địa chỉ vectơ ngắt. Điều này sử dụng cơ chế thực thi lệnh hiện có để lưu PC hiện tại vào ngăn xếp cuộc gọi và thay đổi nó thành địa chỉ vectơ ngắt. Nó cũng liên quan đến việc loại bỏ các hướng dẫn tìm nạp trước và tương tự.

Logic ngắt ngắt đặc biệt cũng phải vô hiệu hóa các ngắt theo cách sao cho cùng một điều kiện ngắt không gây ra một cuộc gọi khác đến địa chỉ vectơ ngắt trong chu kỳ tiếp theo. Các bộ xử lý khác nhau có cách xử lý khác nhau. Đơn giản nhất là chỉ cần vô hiệu hóa các ngắt, yêu cầu phần mềm kích hoạt lại chúng vào cuối thói quen dịch vụ ngắt. Các bộ xử lý khác có mức độ ưu tiên ngắt. Mức này bị va đập để chỉ những điều kiện ngắt có mức độ ưu tiên cao hơn mới có thể gây ra một ngắt mới. Ưu tiên ngắt sau đó là thứ được lưu tự động cùng với địa chỉ trả về CALL và được khôi phục khi mã trả về từ ngắt.


1
Thông thường, nó không phải là một CALLhướng dẫn thông thường , vì các ngắt được chấm dứt theo một cách khác (xem RETso với RETI).
glglgl

1
Tôi có thể giả định một cách an toàn rằng khi phần cứng phát hiện Ngắt đó xác nhận tín hiệu, Thay vì Bộ nhớ, CPU sẽ nhận lệnh từ một nơi khác để nhảy ... Giống như Công tắc có thể ... Khi Công tắc tắt, Tìm nạp lệnh từ Bộ nhớ và khi BẬT chuyển đổi , Thực hiện hướng dẫn này?
Swanand

3

Thông thường trong các bộ vi điều khiển hiện đại có một bộ điều khiển ngắt (IC) chuyên dụng, chịu trách nhiệm quản lý các ngắt. Bên cạnh đó mỗi thành phần ngoại vi có một đầu ra ngắt (s) được đi từ 0đến 1(hoặc ngược lại) nếu một số điều kiện áp dụng (ví dụ ngoại vi này hoàn thành một số công việc). Đầu ra này được kết nối với bộ điều khiển ngắt. Các CoreCPU có thể nói với các IC hoặc phớt lờ cụ này ngắt (mặt nạ nó) hoặc thông báo cho MCU bất cứ khi nào nó xảy ra bằng cách kích hoạt tín hiệu cụ thể, và sau đó là MCU quyết định phải làm gì với nó. Cách phổ biến là yêu cầu IC thông báo cho MCU biết lỗi nào đã xảy ra và chuyển sang mã xử lý tương ứng.


2

Có phần cứng trong lõi máy tính làm kẹt một giá trị mới vào bộ đếm chương trình tương ứng với ngắt cụ thể đã được kích hoạt. Để ghi nhớ nơi quay trở lại sau khi hoàn thành thói quen ngắt, giá trị hiện tại trong bộ đếm chương trình được đẩy vào ngăn xếp trước khi phần cứng kẹt địa chỉ ngắt vào bộ đếm chương trình. Khi thường trình ngắt hoàn thành, giá trị ban đầu của bộ đếm chương trình được khôi phục trở lại khỏi ngăn xếp.

Các giá trị kẹt vào bộ đếm chương trình tại thời điểm ngắt thường được xác định bởi một trong hai sơ đồ. Một cách tiếp cận kẹt một địa chỉ cố định cho từng loại ngắt vào bộ đếm chương trình và lõi máy tính sau đó bắt đầu thực thi từ vị trí cố định đó. Không gian tại vị trí cố định thường bị giới hạn về kích thước, do đó, thông thường mã hóa lệnh nhảy tại các địa chỉ cố định đi đến vị trí dịch vụ ngắt thực tế. Lược đồ khác sử dụng một cái gì đó gọi là bảng vectơ ngắt. Ở đây phần cứng tạo ra một địa chỉ cố định bù vào bảng vectơ dựa trên loại ngắt. Phần cứng sau đó lấy ra nội dung tại vị trí bảng đó và sử dụng giá trị đó làm địa chỉ để kẹt vào bộ đếm chương trình.


2

Bộ điều khiển có một thanh ghi cho bộ đếm chương trình theo dõi địa chỉ nơi lưu trữ lệnh tiếp theo được thực hiện. (Thanh ghi này cũng được viết khi một bước nhảy được thực hiện.)

Bộ điều khiển có một vectơ ngắt (hoặc đôi khi nhiều hơn một, phụ thuộc vào loại ngắt), đây là địa chỉ nơi ISR ​​được lưu trữ. Địa chỉ này luôn giống nhau - giống như vector thiết lập lại, nơi chương trình bắt đầu.

(Thông thường, có một lệnh nhảy được lưu trữ tại vectơ này nhảy tới mã thực tế để thực thi, vì không gian tại vectơ không đủ để lưu trữ toàn bộ quy trình. Tuy nhiên, điều quan trọng là ISR luôn nằm ở cùng một vị trí Chức vụ.)

Khi xảy ra ngắt, có một số phần cứng chuyên dụng trong bộ điều khiển ghi bộ đếm chương trình với vectơ ngắt. Sau đó, khi bộ điều khiển đạt đến chu kỳ lệnh tiếp theo, nó sẽ tìm nạp lệnh từ địa chỉ được chỉ ra bởi bộ đếm chương trình (vì vậy, vectơ ngắt).

(Trong một chu trình lệnh của bộ điều khiển, có các tác vụ khác nhau mà nó thực hiện: nó tìm nạp lệnh tiếp theo từ địa chỉ được chỉ ra bởi bộ đếm chương trình; nó tăng bộ đếm chương trình; nó giải mã lệnh và thực thi nó.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.