Chương 2
câu 1: khái niệm cơ bản về ngắt
Ngắt (interrupt) là quá trình dừng chương trình chính đang chạy để ưu tiên thực hiện một chương trình khác, chương trình này được gọi là chương trình phục vụ ngắt (ISR - Interrupt Service Routine). ISR hoàn toàn giống với một chương trình bình thường trên máy tính, nghĩa là nó có khả năng truy xuất đến tất cả các lệnh ngôn ngữ máy của µP. Tuy nhiên cuối ISR sẽ kết thúc bằng lệnh IRET (Interrupt Return) để µP tiếp tục thực hiện lệnh đã kết thúc trước đây.
Các nguyên nhân dẫn đến ngắt là:
- Bản thân chương trình đang thực hiện bị lỗi, ví dụ như: chia cho 0, …
- Do tác động của thiết bị ngoại vi, ví dụ như: thực hiện lệnh in nhưng máy in lỗi, ghi dữ liệu vào đĩa nhưng không có đĩa, …
- Do lập trình viên chủ động gọi các ngắt có sẵn.
Một cách đơn giản, chúng ta có thể xem ngắt như là quá trình gọi chương trình con nhưng các chương trình con này được tạo ra sẵn trong máy tính và quá trình gọi này có thể xảy ra tại thời điểm không xác định trước.
lưu ý: khi dùng ngắt người lập trình phải dảm bảo các thanh ghi không thay đổi khi quay về chương trình chính, như vậy phải thực hiện thao tác cất giữ nội dung các thanh ghi khi bắt đầu nhảy vào chương trình xử lý ngắt nội dung các thanh ghi phải được khôi phục lại các trạng thái ban đầu
Câu 2: các loại ngắt trong máy tính
Trong các quá trình ngắt, ta phân biệt thành 2 loại: ngắt cứng và ngắt mềm.
Ngắt mềm
Ngắt mềm là một ngắt được gọi bằng một lệnh ở trong chương trình, lệnh đó là INT, nó được sử dụng cùng với số hiệu ngắt. Thí dụ, lệnh gọi ngắt số 5 ( in trang màn hình) được viết là INT 5. Các ngắt mềm cho phép gọi trực tiếp các chương trình con của hệ điều hành. Điều này không những được thực hiện ở mức ngôn ngữ Assembly, mà còn bằng cả ngôn ngữ bậc cao. Lệnh gọi ngắt mềm bản chất là một lệnh gọi hàm đặc biệt. Điều khác biệt các lệnh gọi hàm thông thường khác ở chỗ là hàm mà lệnh gọi ngắt gọi đến là các hàm phục vụ ngắt có sẵn trong tài nguyên phần mềm của máy tính chứ không phải hàm do người lập trình viết
Ngắt cứng
Khác với ngắt mềm, ngắt cứng không được khởi động bởi chương trình mà bởi các thành phần có trong phần cứng của PC ( thí dụ như ổ đĩa hay bàn phím ...). Loại ngắt này là một cơ cấu đơn giản và hiệu quả để bộ sử lý phản ứng kịp thời với các sự kiện không đồng bộ xảy ra trong máy tính.
- hình vẽ
+ ngắt trong: là ngắt bị kích hoặt bởi các chip IC bổ trợ nằm trên main board của IC
+ ngắt ngoài: là ngắt bị kích hoạt bởi thiết bị ngoại vi ở bên ngoài, ngắt ngoài còn được phân biệt thành ngắt che được và ngắt không che được
Câu 3: pp gọi ngắt từ các ngôn ngữ lập trình
Đối với người lập trình bằng ngôn ngữ Assembly, việc gọi ngắt là không có vấn đề gì là khó khăn. Chỉ cần nạp các giá trị cần thiết vào các thanh ghi tương ứng và sau đó thực hiện lệnh INT .
Đối với người lập trình ngôn ngữ bậc cao thì không có khả năng trực tiếp đó, nên phải dùng đến các hàm, các thủ tục hay các chương trình con để gọi ngắt.
- gọi ngắt bằng ngôn ngữ turbo Pascal
Khi nhắc đến các ngôn ngữ lập trình hay các môi trường lập trình PC, ta không thể bỏ qua Turbo Pascal. Vì lý do này và cũng vìTurbo Pascal cho phép gọi ngắt tương đối dễ dàng, nên giáo trình chọn Turbo Pascal làm đại diện cho môi trường Pascal
Để gọi tắt một ngắt, Turbo Pascal cung cấp cho ta thủ tục INTR, nó được gọi với các tham số sau:
INTR( numberinterrupt: byte, regs: Registers):
Tham số numberinterrupt phải là một hằng nguyên cho biết số hiệu ngắt cần gọi. Ta có thể gọi bất kỳ ngắt nào trong khoảng từ 0 đến 225. Thủ tục MSDOS là một dạng đặc biệt của thủ tục INTR. Nó được gọi gần giống như INTR:
MSDOS ( Regs: Registers):
Trong lệnh này số hiệu ngắt bị bỏ qua, vì lệnh được tổ chức theo cơ cấu tự động gọi ngắt số 21 ( hex). Ngắt 21H chính là một thư viện phong phú chứa các hàm chức năng của DOS thông qua ngắt này, ta có thể gọi hầu hết các hàm chức năng của hệ điều hành.
Hai thủ tục trên nhận một tham số kiểu Rigisters. Tham số này chứa các giá trị dành cho các thanh ghi của bộ xử lý trước khi gọi các thủ tục INTR và MSDOS.Các giá trị này sẽ nạp vào các thanh ghi tương ứng trước khi gọi ngắt
- Gọi ngắt trong ngôn ngữ C
Cũng như các ngôn ngữ khác nói chung để gọi một ngắt ta tiến hành theo các bước sau:
+ Đặt chức năng vào thanh ghi AH
+ Xác định các tham số đầu vào và đưa chúng vào các thanh ghi theo yêu cầu của mỗi ngắt
+ Thực hiện câu lệnh gọi ngắt theo số hiệu ngắt
+ Lấy kết quả do ngắt sản ra ( tham số đầu ra từ các thanh ghi )
Để gọi ngắt trong ngôn ngữ C ta dùng hàm:
Void geninterrupt( int sh_ngat);
Và các giả thanh ghi ( pseudo register ):
_AX_AH_AL
_BX_BH_BL
_CX_CH_CL
_DX_DH_DL
_CS_DS_ES_SS
_SP_BP_SI_DI
_FLAGS
Các ký hiệu trên được sử dụng như biến nguyên để truy nhập tới các thanh ghi tương ứng của bộ vi xử lí.
Câu 4: lưu đồ thuật toán cơ chế chặn bắt ngắt
- lưu đồ
- Để thực hiện kỹ thuật đánh tráo ngắt, về bản chất là thực hiện việc đánh tráo nộ dung 4 byte của vector ngắt tương ứng( trong bảng vector ngắt). Nội dung 4 byte này là địa chỉ vào của chương trình được ngắt gọi ra thực hiện. Vậy là chỉ cần biết địa chỉ vào của chương trình của người lập trình cần đánh tráo và gán vào nội dung 4 byte của vector ngắt hiện hành là được. Tuy nhiên để đề phòng trường hợp cần khôi phục lại ngắt cũ trước khi gán giá trị mới cho nó.
Trong khoảng thời gian tiến trình chính được thực hiện khi ngắt số hiệu N được kích hoạt ( tất nhiên đây phải là ngắt cứng và là ngắt mà chúng ta cần đánh tráo ). Chương trình sẽ nhảy vào ngay chương trình con của ta. Điều này có được là do ta đã đánh tráo vector ngắt số hiệu N bằng địa chỉ chương trình con của ta. Tại chương trình con chúng ta có thể bổ xung các chức năng cần thiết phục vụ cho mục đích riêng. Trong thân chương chình con, ta lại gọi chương trình phục vụ ngắt N ra thực hiện bằng lệnh gọi ngắt số hiệu N. Quá trình này chính là quá trình chuyển quyền điều khiển từ chương trình con của ta cho chương trình phục vụ ngắt N. Khi chương trình phục vụ ngắt được thực hiện xong ( gặp lệnh IRET ) tiến trình sẽ nhảy về chương trình con của ta. Tại đây ta lại có thể bổ xung các chức năng khác nữa hoặc có thể chủ động trả quyền điều khiển cho tiến trình chính bằng lệnh RET.
Như vậy bằng kỹ thuật đánh tráo và chặn bắt ngắt ta có thể bổ xung các chức năng cần thiết cho một chương trình phục vụ ngắt mà nó không đáp ứng được đầy đủ yêu cầu của chúng ta.
Bạn đang đọc truyện trên: AzTruyen.Top