Polling v.s Interrupt CHƯƠNG II: Polling Interrupt Một hệ thống thời gian thực gọi “điều khiển kiện” có nghĩa hệ thống phải có chức phản ứng lại kiện xảy môi trường hệ thống Vậy hệ thống phản ứng lại kiện Hiện có hai phương pháp tiếp cận vấn đề Phương pháp Polling hay Vòng lặp Polling Hình – Vòng lặp Polling Hãy xem đoạn code hình Chương trình bắt đầu vài cài đặt ban đầu cho hệ thống truy cập vào vòng lặp vô hạn, đó, kiện mà hệ thống phản ứng lại kiểm tra Khi có kiện xảy ra, dịch vụ phản ứng lại kiện kích hoạt Tiến trình thực vòng lặp tỏ đơn giản thích hợp với hệ thống nhỏ không đòi hỏi gắt gao mặt thời gian Tuy nhiên, có số vấn đề cần bàn đến: - Thời gian phản ứng lại kiện phụ thuộc lớn vào vị trí mà chương trình thực vòng lặp Lấy ví dụ: Nếu kiện event_1 xảy trước câu lệnh if(event_1) thời gian phản ứng ngắn Nhưng kiện event_1 xảy sau câu lệnh kiểm tra đó, chương trình lúc phải quét toàn vòng lặp quay trở điểm đầu thực dịch vụ kiện event_1 - Và hệ tất yếu, thời gian phản ứng hàm số lượng kiện kích hoạt thời điểm sau thời gian thực dịch vụ lần quét vòng lặp chương trình Võ Duy Thành – coinsking208@yahoo.com 1/6 Polling v.s Interrupt - Tất kiện chương trình đối xử cách bình đẳng ưu tiên - Khi có đặc tính mới, dịch vụ mới, thêm vào chương trình, thời gian phản ứng lại dài thêm Phương pháp tiếp cận thứ ngắt (Interrupt) Rất hữu dụng gây không khó khăn cho người lập trình Ý tưởng ngắt: xuất kiện “ngắt” tiến trình thực chương trình, “nhồi” thêm thực tiến trình khác vào hình Khi tiến trình nhồi thêm thực xong, chương trình lại thực tiếp từ thời điểm bị ngắt Tiến trình kiện ngắt thực mà quan tâm đến chương trình Những tiến trình người ta gọi “chương trình dịch vụ ngắt” (Interrupt Service Routine) viết tắt ISR Các hệ vi xử lý thường thực loại ngắt khác - Câu lệnh INT, hay nhiều nhắc đến với tên TRAP (bẫy) Nó câu lệnh để gọi chương trình đặc biệt Chúng ta đề cập đến sau - Các trường hợp đặc biệt xử lý Các điều kiện lỗi lỗi chia 0, lỗi truy cập bất hợp pháp vào nhớ điều khiển thông qua chế ngắt Hình - Ngắt Hai loại ngắt kể đồng với việc thực lệnh Trong đó, INT câu lệnh lỗi đặc biệt xử lý kết trực tiếp việc thực lệnh Võ Duy Thành – coinsking208@yahoo.com 2/6 Polling v.s Interrupt Loại ngắt thứ tạo kiện xảy bên xử lý Loại ngắt tạo I/O phần cứng xảy không đồng với việc thực lệnh Các ngắt không đồng này: - Làm tối đa hoá hiệu suất thông lượng hệ thống máy tính - Gây phần lớn lỗi rắc rối cho người lập trình Hầu hết xử lý sử dụng lược đồ ngắt giống Hình kiến trúc ngắt Intel x86 1kilo byte nhớ giành cho bảng véctơ ngắt (Interrupt Vector Table) Mỗi véctơ có byte thể địa (segment offset) chương trình dịch vụ ngắt Các véctơ mang ý nghĩa, chức khác định nghĩa kiến trúc xử lý Ví dụ: véctơ lỗi chia 0, véctơ breakpoint (lệnh ngắt INT 1byte)… Hình - Ngắt - Bảng véctơ ngắt Một số véctơ dành cho ngắt Trong PC, véctơ đến 15 0x70 đến 0x77 dành cho phần cứng Tất véctơ truy cập thông qua lệnh ngắt INT 2byte, đó, byte thứ số thứ tự véctơ (ngắt) Phần mềm hệ thống thường thiết lập quy ước liên quan đến nhiều véctơ Ví dụ: PC BIOS sử dụng số ngắt cho dịch vụ phần cứng LINUX sử dụng ngắt INT 0x80 để gọi dịch vụ kernel Sau ví dụ việc sử dụng ngắt INT 0x80 Linux - Bộ xử lý lưu lại giá trị thời ghi đếm chương trình Program Counter (PC) Code Segment (CS) vào ngăn xếp stack với từ điều khiển trạng thái xử lý Proccesor Status Word (PSW) Võ Duy Thành – coinsking208@yahoo.com 3/6 Polling v.s Interrupt - Byte thứ câu lệnh INT số bảng véctơ ngắt để từ tìm địa chương trình dịch vụ ngắt (ISR) Bộ xử lý nạp địa vào ghi PC CS việc thực chương trình thực từ điểm Hình - Ngắt hoạt động ngắt - Kết thúc ISR câu lệnh IRET (Interrupt Return) Nó giải phóng PC CS để nạp lại giá trị chương trình thực tiếp lệnh sau lệnh INT Lệnh INT tương tự lệnh gọi chương trình CALL có đôi chút khác biệt: địa đích lệnh CALL nhúng vào câu lệnh với INT, ta không cần quan tâm đến địa ISR Địa nầm bảng véctơ ngắt Đây điểm thuận lợi cho việc truyền thông chương trình biên dịch chương trình tải, ví dụ chương trình ứng dụng hệ điều hành Các ngắt có cách thức thực thể hình Một thiết bị bên đưa “yêu cầu ngắt” Interrupt Request (IRQ) Khi xử lý phản ứng lại xác nhận “chấp nhận ngắt” Interrupt Acknowledge (IAK), thiết bị gửi số thứ tự véctơ ngắt lên bus liệu Bộ xử lý sau thiết lập lệnh ngắt INT với số véctơ ngắt cung cấp Võ Duy Thành – coinsking208@yahoo.com 4/6 Polling v.s Interrupt Hình – Ngắt cứng Trong thực tế, hầu hết hệ thống sát nhập thêm thiết bị ngoại vi đặc biệt gọi điều khiển ngắt Interrupt Controller để quản lý công việc chi tiết chẳng hạn gửi số véctơ ngắt lên bus liệu vào thời điểm cần thiết Kiến trúc PC bao gồm điều khiển ngắt 8259, quản lý ngắt Mỗi 8259 có chế quản lý ngắt theo kiểu ưu tiên Do đó, thiết bị quan trọng ưu tiên thiết bị khác quan trọng Ngắt kích hoạt bị vô hiệu hoá Ở cấp độ xử lý, ngắt kích hoạt vô hiệu hoá thông qua câu lệnh STI CLI Các ngắt kích hoạt vô hiệu cách có chọn lọc điều khiển ngắt 8259 hay thiết bị Trên thực tế, việc kích hoạt vô hiệu ngắt điểm mấu chốt để thiết kế thực thi phần mềm thời gian thực Cũng đáng ngạc nhiên nói ngắt không đồng có vấn đề đáng bàn Để ý ứng dụng thu thập liệu dựa A/D đa kênh hình Cứ chuyển đổi A/D thu thập tập hợp liệu kênh, ngắt xử lý Chương trình dịch vu ngắt đọc liệu cất vào nhớ đệm, nơi mà chương trình khác (còn gọi chương trình nền) tiếp tục xử lý Hình – Ví dụ ngắt Võ Duy Thành – coinsking208@yahoo.com 5/6 Polling v.s Interrupt Hoạt động điều khiển ngắt cho phép phản ứng lại A/D cách nhanh chóng nhớ đệm tách chương trình khỏi nguồn liệu, ví dụ, chương trình không cần quan tâm đến liệu từ đâu mà có Bây xem đến đoạn mã lệnh ghi hình Giả thiết thí nghiệm, cung cấp tín hiệu biến đổi liên tục vào kênh Đồng thời, giả thiết chương trình không bị “fail” thực đo tín hiệu đồng Trong thực tế, chương trình viết chắn bị “fail” ngắt xảy cập nhật biến Cur_temp cập nhật biến Set_temp với kết giá trị biến Cur_temp cập nhật từ tập hợp liệu cũ trước đó, giá trị biến Set_temp cập nhật từ tập hợp liệu thời Như vậy, tín hiệu đầu vào thay đổi theo thời gian tập hợp liệu tách rời thời gian xác định, giá trị biến khác đó, chương trình “fail” Đây chất vấn đề lập trình thời gian thực Cần phải quản lý ngắt không đồng để chúng không xảy vào thời điểm không thích hợp Có giải pháp, dù không hay cho lắm, để giải vấn đề Ta dùng lệnh vô hiệu hoá ngắt (CLI) trước cập nhật biến Cur_temp kích hoạt ngắt lệnh STI sau cập nhật biến Set_temp Việc làm giúp ngắt tránh khỏi phiền phức việc cập nhật liên tục đề cập Có vẻ sáng suốt sử dụng lệnh CLI STI chìa khoá cho giải pháp đắn, đơn giản rải lệnh CLI STI code chương trình chẳng khác việc sử dụng lệnh “go to” biến toàn cục Võ Duy Thành – coinsking208@yahoo.com 6/6