Bài tập 10

Chương trình ngắt mềm

 

Mục đích-yêu cầu:

  • Làm quen với ngắt mềm và nhận ra sự khác nhau giữa ngắt mềm và gọi thủ tục.
  • Hiểu về bảng vectơ ngắt và cách gọi ngắt mềm như thế nào?
  • Sử dụng ngắt mềm trong trao đổi dữ liệu.

Kiến thức nền:

1/ Ngắt và thủ tục:

 Tính ưu việt của hệ vi xử lý trong điều khiển hệ thống đó là tính uyển chuyển (flexible): dễ dàng thay đổi chương trình để thích nghi với môi trường làm việc. Muốn vậy, khi có tín hiệu cần trao đổi với hệ thống, CPU phải tạm dừng công việc hiện tại để phục vụ việc trao đổi dữ liệu. Sau khi hoàn thành việc trao đổi dữ liệu, CPU lại quay về làm tiếp công việc đang làm dở dang. Cách làm việc kiểu này gọi là ngắt CPU. Ngắt là một đoạn mã ngắn cung cấp các dịch vụ hữu ích có thể sử dụng bằng các chương trình khác nhau. Chương trình ngắt điển hình như  thi hành các phím nhấn, sự di chuyển chuột, nút nhấn, màn hình soạn thảo, đọc đĩa, viết .

               Ngắt mềm bản chất là một lệnh CALL đặt biệt, nó được gọi một cách chủ động theo nhiều cách thông qua chương trình của người lập trình nghĩa là nó được viết tại một vi trí cố định trong chương trình và nhờ vào vector ngắt chỉ đến chương trình phục vụ ngắt cụ thể. Nếu nhìn một cách hời hợt từ bên ngoài, ta dễ nhầm lẫn giữa gọi thủ tục và ngắt mềm, thực ra chúng vẫn có điểm khác: nếu như  gọi thủ tục là việc gọi đi gọi lại một đoạn chương trình nào đó bất kỳ (do người lập trình lập ra) thì ngắt mềm lại gọi một đoạn chương trình đa số được chuẩn hoá cho việc ngắt, ví dụ: khi giao tiếp CPU trong hệ thống với cổng RS232 của máy tính ta chỉ cần dùng lệnh INT 21 máy sẽ hiểu và thực thi ngay lệnh ngắt này. Tuy vậy vẫn có thể dùng CALL thay cho ngắt mềm, vì thế trong họ vi điều khiển 8051 người ta không dùng ngắt mềm mà chỉ dùng ngắt cứng do ứng dụng cục bộ của vi điều khiển, trong khi vi xử lý có ứng dụng rộng lớn hơn nhiều.

               Ngắt cứng được gây ra bởi tín hiệu điện tới CPU từ các thiết bị phần cứng. Ngắt này xảy ra ở một thời điểm nào đó bất kỳ mà người lập trình không thể biết được, ví dụ như khi hết giấy trong khay máy in, chuyên gia lập trình của Microsoft không thể biết ! nhưng họ có thể lường trước được khả năng này do vậy tín hiệu hết giấy trên được chuyển thành tín hiệu điện truyền đến CPU, người lập trình nhờ vào vector ngắt chỉ đến đoạn chương trình phục vụ ngắt để giải quyết vấn đề trên. Như vậy, một thủ tục phục vụ ngắt có thể xuất hiện bất cứ lúc nào trong khi chương trình đang chạy, trong khi đó các thủ tục thông thường chỉ xuất hiện ở những vị trí cố định trong chương trình.

    Cũng giống như ở thủ tục, trước khi thực hiện chương trình phục vụ yêu cầu ngắt, địa chỉ trở về cần được cất vào ngăn xếp. 

   Khi hoạt động ở cơ chế ngắt thiết bị ngoại vi chủ động phát tín hiệu ngắt cho hệ vi xử lý qua chân INT (Interrupt). CPU có phương thức kiểm tra sự xuất hiện của tín hiệu yêu cầu ngắt này và sẽ đáp ứng khi có thể.

 

 

 

                        Hình 4.1: Cơ chế ngắt

2/ Ngắt mềm:

Là ngắt được gọi bằng một lệnh ở trong chương trình. Lệnh đó là INT kèm theo số hiệu ngắt n, ví dụ: lệnh gọi ngắt số 5 được viết là INT 5. Các ngắt mềm này cho phép gọi trực tiếp các thủ tục (chương trình con) phục vụ ngắt có trong chương trình.

3/ Bảng vectơ ngắt (Interrupt Vector Table):

Khi một ngắt được chấp thuận, giá trị của địa chỉ bắt đầu của chương trình phục vụ ngắt gọi là vectơ ngắt. Các số hiệu ngắt n đều tương ứng với các địa chỉ xác định của ô nhớ có chứa địa chỉ đầu tiên của chương trình con phục vụ ngắt chứa trong bảng vectơ ngắt. Nói cụ thể hơn : đối với các nguyên nhân ngắt khác nhau thì CPU sẽ thực thi các mã lệnh khác nhau để gọi cho ngắt ấy một chương trình ngắt tương ứng, địa chỉ đầu tiên của chương trình này được xác định qua bảng vector ngắt. Trong các máy IBM, bảng này nằm trong bộ nhớ trung tâm bắt đầu tại địa chỉ 0 đến 1024.

            3/ Gọi lệnh ngắt (calling an interrupt) :

Ðây là một việc làm phức tạp. Lệnh INT 02  làm CPU gọi ra nội dung chứa trong RAM tại địa chỉ 02. Sau khi lưu địa chỉ trở về trong ngăn xếp, con trỏ lệnh IP được chỉ tới vị trí này. Mã ngắt khi ấy được thực hiện. Khi hoàn thành lệnh IRET làm cho chương trình quay trở về từ lệnh ngắt đó. Con trỏ lệnh IP được đặt tới địa chỉ đã được lưu trong ngăn xếp ban đầu. 

Chương trình:

;Chương trình ngắt phần mềm-------------------------------------------------------

      JMP     Start                  ;nhảy qua bảng của vectơ ngắt

      DB      51              ;vectơ tại địa chỉ 02 chỉ tới địa chỉ 51

      DB      71              ;vectơ tại địa chỉ 03 chỉ tới địa chỉ 71

     Start:

      INT     02                       ;ngắt  02

      INT     03                       ;ngắt  03

      JMP     Start

;----------------------------------------------------------------------------------------

      ORG         50

      DB         E0

;---------------đảo các bit trong ô nhớ 50-------------------

             MOV        AL,[50]

           NOT         AL                    

           MOV        [50],AL         

;------------------------------------------------------------

           OUT         01       ;Sáng tất cả bóng đèn của đèn giao thông bên phải

           IRET

;---------------------------------------------------------------------------------------           ORG           70           ;chuyển các bit từ RAM vào AL

           DB             0

           MOV     AL,[70]

           NOT         AL             ;đảo các bit trong AL

           AND         AL,FE              ;Bắt buộc bít bên phải ngoài cùng bằng 0

           MOV     [70],AL            ;chuyển các bit đã đảo lại vào RAM

           OUT         02              ;hiển thị số 8 trên Led 7 đoạn bên trái

           IRET

  END

;---------------------------------------------------------------------------------------

Bài tập 10. Nhấn nút Play để xem.

Tải file phim về ở đây.